【问题标题】:How to check is X509Certificate2 exportable or not如何检查 X509Certificate2 是否可导出
【发布时间】:2015-11-28 01:23:57
【问题描述】:
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 实例。如何检查可导出的私钥? (最好不要尝试显式导出)

【问题讨论】:

  • 使用什么机制和参数导出?该代码仅显示查找证书。
  • 没关系。例如,使用充气城堡:var key = DotNetUtilities.GetKeyPair(GetCertificate(thumbprint).PrivateKey).Private;。如果证书不可导出,此代码将引发异常。或者在 windows 证书 mmc 管理单元中,您可以选择证书,右键单击它,所有任务,导出。当证书不可导出时,可以禁用出现的窗口私钥无线电。我想以编程方式检测它:是否可导出。

标签: c# .net certificate


【解决方案1】:

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

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

RSACryptoServiceProvider 类是一个非对称算法

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

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

【讨论】:

    【解决方案2】:

    查看reference sourceExport方法的实现做了以下检查:

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

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

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

    【讨论】:

    • 好的。现在我按照你说的实现:尝试导出并捕获异常。
    【解决方案3】:

    使用这个方法:

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

    使用方法:

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

    【讨论】:

    • 这是 try..catch 方法。我在我的应用程序中使用您的示例中的代码。是的,它有效。但这不是我想要的。我很惊讶如果没有这个自行车发明,没有 API 可以直接检查它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2011-12-02
    • 2012-10-12
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多