在C#中导入证书时,`PersistKeySet`-StorageFlag会产生什么影响?

Guy*_*tag 8 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();
}
Run Code Online (Sandbox Code Playgroud)

使用此代码,证书已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);
Run Code Online (Sandbox Code Playgroud)

使用这些标志,证书可以在所有设备上使用.即使我很高兴我的应用程序现在以预期的方式工作,我想了解原因?PersistKeySet-Flag究竟做了什么,为什么它会影响证书的使用时间和人员?

在这种情况下,MSDN不是很有用.

bar*_*njs 16

导入PFX时,公共证书元素将加载到内存中,私钥材料将被转移到密钥存储提供程序中..NET中的默认行为是在X509Certificate2对象为Disposed时删除私钥材料(或者其资源正在通过垃圾收集完成).该PersistKeySet标志可防止此清理发生.

如果要添加到持久性证书库,则始终要设置PersistKeySet.如果不添加到持久存储,您很可能不希望它设置.

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

  • https://support.microsoft.com/en-us/kb/950090描述了无法使用PersistKeySet,https://github.com/dotnet/corefx/issues/8186描述了两种当前的导入模式,以对比建议的第三种一,并且可以在https://github.com/dotnet/corefx上搜索.NET Core实现(.NET Framework版本在VM内处理,因此不在ReferenceSource上处理). (2认同)