【发布时间】:2016-08-20 10:02:27
【问题描述】:
在我的应用程序中,使用以下代码以编程方式将客户端身份验证证书添加到 MY-Store:
//certData is a byte[]
//password is a SecureString
X509Certificate2 certificate = new X509Certificate2(certData, password, X509KeyStorageFlags.Exportable);
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
try
{
store.Open(OpenFlags.ReadWrite);
store.Add(certificate);
}
finally
{
store.Close();
}
使用此代码,证书已正确导入我测试的所有机器上的MY-Store(指纹和证书链也正确)。
但在某些机器上(Windows 7 Professional SP1 和 Widnows Server 2008 R2 与本地用户帐户)之后,证书无法用于客户端身份验证(“无法为 SSL/TLS 安全通道建立信任关系")。 在具有域用户帐户的 Windows 8.1 Enterprise 计算机上,身份验证有时但并非总是有效。
我拼命尝试了几件事,最后找到了将X509KeyStorageFlags.PersistKeySet 添加到存储标志的解决方案。
所以第一行现在是:
X509Certificate2 certificate = new X509Certificate2(certData, password, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);
使用这些标志,证书可以在所有设备上使用。 尽管我很高兴我的应用程序现在可以按预期方式运行,但我想了解为什么? PersistKeySet-Flag 究竟做了什么?为什么它会影响证书的使用时间和使用对象?
MSDN 在这种情况下不是很有帮助。
【问题讨论】:
-
可能与安装在临时容器而不是永久容器中的密钥有关。详情见这里:support.microsoft.com/en-gb/kb/950090
标签: c# ssl client-certificates