“無法訪問已配置證書的私鑰。”
我正在嘗試(但失敗)替換 ADFS 2.0 獨立安裝的證書。我已經生成了證書並將它們放在本地機器儲存中。但是,無論我做什麼,我都不可避免地會在 ADFS 啟動時報告相同的錯誤:
在處理聯合服務配置期間,發現元素“signingToken”具有無效數據。無法訪問已配置證書的私鑰。以下是證書的值:
元素:signingToken
主題:CN=簽名證書
指紋:<snip>
店鋪名稱:我的
店舖位置:0
聯合服務標識:NT AUTHORITY\NETWORK SERVICE
…
使用者操作
如果證書是從沒有私鑰的源導入的,請選擇具有私鑰的證書,或從包含私鑰的源(例如 .pfx 文件)再次導入證書。
如果證書是在使用者上下文中導入的,請驗證上面指定的儲存與導入證書的儲存是否匹配。
如果證書是由未指定“機器密鑰”選項的證書請求生成的,並且該密鑰被標記為可導出,則將帶有私鑰的證書從使用者儲存導出到 .pfx 文件,然後再次將其直接導入到儲存在配置文件中指定。如果密鑰未標記為可導出,請使用“機器密鑰”選項申請新證書。
如果尚未授予聯合身份驗證服務身份對證書私鑰的讀取權限,請使用證書管理單元更正此情況。
好吧,我已經遵循了上述所有建議的使用者操作,但都沒有解決問題。對於下一步要採取的診斷步驟,我似乎也找不到任何其他人的建議。那麼,我現在要嘗試什麼?
重新啟動時出現 5 個錯誤。前四個如上,變化不大:首先是
Element: serviceIdentityToken
和 服務通信證書,然後encryptionToken
是 ,additionalEncryptionTokens
, 和signingToken
我要用於解密和簽名的證書,最後:啟用聯合服務的端點時出錯。使用 PowerShell cmdlet 修復配置錯誤並重新啟動聯合身份驗證服務。
我認為這第五個錯誤與前四個有關,但如果不是,我可以為其添加更多詳細資訊。SSL 和簽名證書都是由我們的域 CA 生成的。
我想嘗試獲取更多資訊,所以(知道 ADFS 是用 .NET 編寫的)我拼湊了一個 .NET 服務項目,該項目只是試圖獲取相同的證書私鑰,它產生以下異常:
System.Security.Cryptography.CryptographicException: Invalid provider type specified. at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer) at System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle) at System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair() at System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize) at System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey() at WindowsService1.Service1.DoStuff() in c:\Dev\WindowsService1\WindowsService1\Service1.cs:line 45
一些Google搜尋讓我相信這與使用 CNG 儲存的私鑰有關,這在(4.0 之前的?).NET 中不起作用。但是,我發現的解決此問題的唯一建議是 a) 更改 CA 伺服器上的模板(我個人無權訪問此模板),或 b) 導出並重新導入證書 -但我已經嘗試過一次。
我找不到任何證書的導出和導入順序來糾正這個問題,所以最後我們複製了ADFS 和 Web 伺服器的證書模板,並使新模板與 2003 CA 兼容,而不僅僅是 2008。
反過來,這使我們能夠選擇較舊的 CSP 而不僅僅是基於 CNG 的 CSP,這是新模板允許我們選擇用於私鑰儲存的所有內容。