“无法访问已配置的证书的私钥。”

“无法访问已配置的证书的私钥。”

我正在尝试(但失败了)替换 ADFS 2.0 独立安装的证书。我已经生成了证书并将其放在本地机器存储中。但是,无论我做什么,ADFS 启动时都会不可避免地报告相同的错误:

在处理联合身份验证服务配置期间,发现元素“signingToken”包含无效数据。无法访问已配置的证书的私钥。以下是证书的值:

元素:signingToken

主题:CN=签名证书

指纹:<snip>

商店名称: My

商店位置: 0

联合身份验证服务标识: NT AUTHORITY\NETWORK SERVICE

...

用户操作

如果证书是从没有私钥的源导入的,请选择具有私钥的证书,或从包含私钥的源(例如,.pfx 文件)再次导入证书。

如果证书是在用户上下文中导入的,请验证上面指定的存储是否与导入证书的存储相匹配。

如果证书是由未指定“机器密钥”选项的证书请求生成的,并且密钥被标记为可导出,则将带有私钥的证书从用户存储导出到 .pfx 文件,然后将其直接导入配置文件中指定的存储。如果密钥未标记为可导出,请使用“机器密钥”选项请求新证书。

如果联合身份验证服务标识尚未被授予对证书私钥的读取权限,请使用证书管理单元更正此情况。

好吧,我已遵循上述所有建议的用户操作,但都没有解决问题。我似乎也找不到其他人对下一步应采取哪些诊断步骤的建议。那么,我现在该尝试什么呢?

我重新启动时收到 5 个错误。前四个与上文相同,但略有不同:首先是Element: serviceIdentityToken和服务通信证书,然后是encryptionTokenadditionalEncryptionTokenssigningToken我想要用于解密和签名的证书,最后是:

启用联合身份验证服务的端点时出错。使用 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

经过谷歌搜索,我相信这与使用 CNG 存储的私钥有关,而 CNG 在 .NET(4.0 之前的版本?)中不起作用。但是,我发现解决此问题的唯一建议是 a) 更改 CA 服务器上的模板(我个人无权访问此服务器),或 b) 导出并重新导入证书 - 但我已经尝试过一次了。

答案1

我找不到任何导出和导入证书的顺序来纠正这个问题,所以最后我们复制证书模板用于 ADFS 和 Web 服务器,并使新模板与 2003 CA 兼容,而不仅仅是 2008。

这反过来又允许我们选择较旧的 CSP,而不仅仅是基于 CNG 的 CSP,而新模板只允许我们选择基于 CNG 的 CSP 来进行私钥存储。

相关内容