在我的应用程序中,使用以下代码以编程方式将客户端认证证书添加到
MY
-存储中:
在我的应用程序中,使用以下代码以编程方式向MY
存储添加客户端认证证书:
//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
存储区(指纹和认证链也正确)。
但是在某些计算机上(具有本地用户帐户的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标志到底是做什么的?它为什么会影响证书能够何时以及由谁使用?
在这种情况下,MSDN并没有提供太多帮助。