C# 如何检查X509Certificate2是否可导出

C# 如何检查X509Certificate2是否可导出,c#,.net,certificate,C#,.net,Certificate,现在我们有了X509Certificate2实例。如何检查可导出私钥?(最好不尝试显式导出)查看,导出方法的实现进行以下检查: X509ContentType参数为Cert、SerializedCert或Pfx 当内容类型为Pfx时,它会对导出和打开权限提出关键容器权限要求 除此之外,其他一切都是通过对CLR的内部调用来实现的,因此很难说对调用方有什么要求。我无法在测试可导出标志的源代码中观察到检查 在这种情况下,我建议您尝试执行导出,并将任何异常作为反馈处理;您无法用证书公开的信息合理地预

现在我们有了X509Certificate2实例。如何检查可导出私钥?(最好不尝试显式导出)

查看,导出方法的实现进行以下检查:

  • X509ContentType
    参数为
    Cert
    SerializedCert
    Pfx
  • 当内容类型为
    Pfx
    时,它会对
    导出
    打开
    权限提出关键容器权限要求
除此之外,其他一切都是通过对CLR的内部调用来实现的,因此很难说对调用方有什么要求。我无法在测试可导出标志的源代码中观察到检查


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

我在这里找到的另一种方法:

X509Certificate2.PrivateKey获取表示与证书关联的私钥的非对称Gorithm对象

RSACryptServiceProvider类是一种非对称算法

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


更新:工作。因此,如果您使用RSA证书,这是可以接受的方法。

使用此方法:

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];
public static bool CheckCertificateIsExportable(X509Certificate2 certForCheck, X509ContentType certType)
    {
        try
        {
            certForCheck.Export(certType);
            return true;
        }
        catch
        {
            return false;
        }
    }
如何使用:

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];
public static bool CheckCertificateIsExportable(X509Certificate2 certForCheck, X509ContentType certType)
    {
        try
        {
            certForCheck.Export(certType);
            return true;
        }
        catch
        {
            return false;
        }
    }

使用什么机制和参数导出?代码只显示查找证书。这无关紧要。例如,使用bouncy castle:
var key=DotNetUtilities.GetKeyPair(GetCertificate(thumbprint).PrivateKey.Private。如果证书不可导出,此代码将引发异常。或者在windows证书mmc管理单元中,您可以选择证书,右键单击它,所有任务,导出。在出现的窗口中,当证书不可导出时,可以禁用私钥无线电。我想以编程方式检测它:是否可导出。确定。现在我实现了您所说的:尝试导出并捕获异常。这是try..catch方法。我在我的应用程序中使用类似于您示例中的代码。是的,它起作用了。但这并不是我想要的。我很惊讶,没有这个自行车发明,就没有api可以直接检查它。