c# - 在 C# 中导入证书时 `PersistKeySet` -StorageFlag 的影响是什么

标签 c# ssl client-certificates

在我的应用程序中,使用以下代码以编程方式将用于客户端身份验证的证书添加到 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 在这种情况下不是很有帮助。

最佳答案

当导入 PFX 时,公共(public)证书元素被加载到内存中,私钥 Material 被保存到 key 存储提供程序中。 .NET 中的默认行为是在处置 X509Certificate2 对象(或其资源正在通过垃圾收集完成)时删除私钥 Material 。 PersistKeySet 标志可防止此清理发生。

如果您要添加到持久证书存储,您总是希望设置 PersistKeySet。当不添加到持久存储时,您很可能不希望设置它。

如果您的导入过程是长期存在的,那么您会看到的行为是在导入后的任意时间对私钥的新访问开始失败。如果它是短暂的,那么它可能总是无法工作。

关于c# - 在 C# 中导入证书时 `PersistKeySet` -StorageFlag 的影响是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36867243/

相关文章:

c# - 如何在 ASP.NET MVC 中应用评级

c# - MVVM DDD 应用程序中的组合根

java - 通过 ssl 的 Jetty WebSocketClient

ssl - 2 向 SSL - 客户端证书未发送到服务器

Xamarin Android : Native TLS, ClientWebSocket,自定义证书颁发机构证书验证失败

客户端证书的Android okhttp3错误

c# - c#main方法的工作方式

c# - 在 Compact Framework、Silverlight、WP7 和完整的 .NET 运行时之间共享代码的方法

php - CURL 和 PHP SSLv3 错误并且无法使 TLS 工作

python - 如何通过 setuptools 安装支持 SSL 的 MySQL-python?