首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从X509Store加载受密码保护的证书?

如何从X509Store加载受密码保护的证书?
EN

Stack Overflow用户
提问于 2012-09-13 11:48:45
回答 3查看 13.1K关注 0票数 21

我正在构建一个受ACS保护的Azure WCF服务,它需要客户端通过证书进行身份验证。

我希望客户端(和服务器)从X509Store而不是从文件系统加载它们各自的密码证书。

我使用的是以下代码:

代码语言:javascript
复制
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语句修改为:

代码语言:javascript
复制
return new X509Certificate2(certCollection[0].Export(X509ContentType.Pfx, "password"));

但是,此操作会失败,并显示CryptographicException“指定的网络密码不正确”。

密码编辑:如果没有传入参数, .Export()方法可以正常工作。

对此有什么帮助吗?

EN

回答 3

Stack Overflow用户

发布于 2012-09-13 12:07:12

导出时,您提供的密码是要用于导出文件的密码,而不是源证书的密码。

我不确定您可以如何处理X509Store和受密码保护的证书,因为密码应该提供给X509Certificate构造函数,并且您会从存储中获得已经实例化的对象。

我认为你可以从你想要的证书中获取原始数据,然后用你想要的密码构造一个新的证书。例如:

代码语言:javascript
复制
X509Certificate2 cert = new X509Certificate2(certCollection[0].GetRawCertData, password);

我还建议您在处理密码时尝试使用SecureString (但这是一堆不同的蠕虫...)

票数 9
EN

Stack Overflow用户

发布于 2012-09-18 08:46:44

我使用不带'password‘参数的Export,它工作正常,没有问题。

票数 2
EN

Stack Overflow用户

发布于 2021-12-16 13:00:40

当证书被导入到证书存储中时,我认为必须将密钥标记为“可导出”,否则我认为您不能导出私钥。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12399156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档