我正在尝试(但失败了)替换 ADFS 2.0 独立安装的证书。我已经生成了证书并将其放在本地机器存储中。但是,无论我做什么,ADFS 启动时都会不可避免地报告相同的错误:
在处理联合身份验证服务配置期间,发现元素“signingToken”包含无效数据。无法访问已配置的证书的私钥。以下是证书的值:
元素:signingToken
主题:CN=签名证书
指纹:<snip>
商店名称: My
商店位置: 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
经过谷歌搜索,我相信这与使用 CNG 存储的私钥有关,而 CNG 在 .NET(4.0 之前的版本?)中不起作用。但是,我发现解决此问题的唯一建议是 a) 更改 CA 服务器上的模板(我个人无权访问此服务器),或 b) 导出并重新导入证书 - 但我已经尝试过一次了。
答案1
我找不到任何导出和导入证书的顺序来纠正这个问题,所以最后我们复制证书模板用于 ADFS 和 Web 服务器,并使新模板与 2003 CA 兼容,而不仅仅是 2008。
这反过来又允许我们选择较旧的 CSP,而不仅仅是基于 CNG 的 CSP,而新模板只允许我们选择基于 CNG 的 CSP 来进行私钥存储。