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实例。如何检查可导出的私钥? (最好不要试图明确导出)
答案 0 :(得分:1)
查看reference source,Export
方法的实现会进行以下检查:
X509ContentType
参数为Cert
,SerializedCert
或Pfx
。Pfx
时,它会对Export
和Open
权限提出密钥容器权限要求。除此之外,其他一切都是通过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...
}