如何从 X509Store 加载受密码保护的证书?
Posted
技术标签:
【中文标题】如何从 X509Store 加载受密码保护的证书?【英文标题】:how to load password protected certificates from the X509Store? 【发布时间】:2012-09-06 02:55:03 【问题描述】:我正在构建一个受 ACS 保护的 Azure WCF 服务,该服务将要求客户端通过证书进行身份验证。
我希望客户端(和服务器)从 X509Store 而不是从文件系统加载各自的密码证书。
我正在使用此代码:
private static X509Certificate2 GetCertificate(string thumbprint)
var certStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
certStore.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certCollection = certStore.Certificates.Find(
X509FindType.FindByThumbprint,
thumbprint, false);
certStore.Close();
if (certCollection.Count == 0)
throw new System.Security.SecurityException(string.Format(CultureInfo.InvariantCulture, "No certificate was found for thumbprint 0", thumbprint));
return certCollection[0];
问题是,它没有加载验证所需的私钥。我试图将return语句修改为:
return new X509Certificate2(certCollection[0].Export(X509ContentType.Pfx, "password"));
但是,这会失败并出现 CryptographicException “指定的网络密码不正确”。
编辑: 如果不传入密码参数,.Export() 方法可以正常工作。
有什么帮助吗?
【问题讨论】:
什么是受密码保护的证书? 带密码的 pfx。我可以按如下方式从文件系统加载它: new X509Certificate2(filename, password) 【参考方案1】:导出时,您提供的密码是您要用于导出文件的密码,而不是源证书的密码。
我不确定您可以使用 X509Store 和受密码保护的证书做什么,因为密码应该提供给 X509Certificate 构造函数,并且您会从存储中获取已经实例化的对象。
我认为您可以从您想要的证书中获取原始数据,然后使用您想要的密码构建一个新数据。例如:
X509Certificate2 cert = new X509Certificate2(certCollection[0].GetRawCertData, password);
我还建议您在处理密码时尝试使用SecureString
(但那是一个不同的蠕虫包......)
【讨论】:
是的,我试过了。虽然 certCollection[0] 有 PrivateKey,但新证书没有(PrivateKey 属性为 null,HasPrivateKey 属性返回 false。 嗯,可能是托管证书存储(或一般存储)根本不支持它。我认为通常使用商店中的证书会导致出现提示,让用户输入密码。也许这被隐藏了?【参考方案2】:我使用了没有“密码”参数的导出,它没有问题。
【讨论】:
【参考方案3】:当证书导入证书存储时,我认为密钥必须标记为“可导出”,否则我认为您不能导出私钥..
【讨论】:
以上是关于如何从 X509Store 加载受密码保护的证书?的主要内容,如果未能解决你的问题,请参考以下文章
X509Store 证书问题。查找 FindByThumbprint
java 从 PKCS12(比如pfx格式)证书中提取私钥证书(PrivateKey)和受信任的公钥证书(X509Certificate)的序列号(SerialNumber)