如何检查X509Certificate2是否可导出

时间:2015-09-02 13:39:18

标签: c# .net certificate

var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);

var certificates = store.Certificates.Find(
    X509FindType.FindByThumbprint, thumbprint, false);

X509Certificate2 cert = certificates[0];

现在我们有了X509Certificate2实例。如何检查可导出的私钥? (最好不要试图明确导出)

3 个答案:

答案 0 :(得分:1)

查看reference sourceExport方法的实现会进行以下检查:

  • X509ContentType参数为CertSerializedCertPfx
  • 当内容类型为Pfx时,它会对ExportOpen权限提出密钥容器权限要求。

除此之外,其他一切都是通过CLR的内部调用发生的,因此很难说出对调用者有什么要求。我无法在源代码中观察检查可导出标志的信息。

在这种情况下,我建议您尝试执行导出并处理任何异常作为反馈;你不能用证书公开的信息合理地预测电话会议的结果。

答案 1 :(得分:1)

我在这里找到的另一种方法:How to determine whether an X509Certificate2 is exportable

  

X509Certificate2.PrivateKey获取AsymmetricAlgorithm对象,该对象表示与证书关联的私钥。

     

RSACryptoServiceProvider类是AsymmetricAlgorithm

     

然后获取RSACryptoServiceProvider.CspKeyContainerInfo,它是一个CspKeyContainerInfo对象,具有Exportable属性:获取一个值,该值指示是否可以从密钥容器导出密钥。

更新:有效。因此,如果您使用RSA证书,则可接受。

答案 2 :(得分:0)

使用此方法:

public static bool CheckCertificateIsExportable(X509Certificate2 certForCheck, X509ContentType certType)
    {
        try
        {
            certForCheck.Export(certType);
            return true;
        }
        catch
        {
            return false;
        }
    }

使用方法:

if (CheckCertificateIsExportable(certForCheck, X509ContentType.Pkcs12))
        {
            // Do...
        }