c# - 如何从 X509Store 加载受密码保护的证书?

标签 c# .net x509certificate2 pfx

我正在构建一个受 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 new X509Certificate2(certCollection[0].Export(X509ContentType.Pfx, "password"));

但是,这会因 CryptographicException“指定的网络密码不正确”而失败。

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

有什么帮助吗?

最佳答案

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

我不确定您可以使用 X509Store 和受密码保护的证书做什么,因为应该将密码提供给 X509Certificate 构造函数,并且您会从存储中获取已经实例化的对象。

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

X509Certificate2 cert = new X509Certificate2(certCollection[0].GetRawCertData, password);

我还建议您在处理密码时尝试使用 SecureString(但那是另一回事......)

关于c# - 如何从 X509Store 加载受密码保护的证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12399156/

相关文章:

c# - 使用 LINQ 插入新的 XML 节点

c# - C# .NET 中最流行/最常用/最重要的接口(interface)?

C# 不信任已安装的证书

c# 验证 X509Certificate2 : am I doing this right?

c# - 无法通过通用名称从 C# 中的存储中获取证书

c# - 在c#中使用while循环,在两个num之间进行计数,仅打印可被第三个num整除的num

c# - 如何从文件读取/写入 C# BigIntegers?

c# - 如何在数据绑定(bind)项控件中获取项目的下一个兄弟项?

c# - 如何处理 flurl 中的错误请求异常

c# - 惰性依赖注入(inject)