CertGetCertificateContextProperty 返回 CRYPT_E_NOT_FOUND

问题描述

我们正在使用 .NET 为证书加载 X509Certificate2,该证书的密钥存储在 SafeNet Luna 7 Network HSM 上。通常我们可以调用 cert.GetRSAPrivateKey()获取 RSACng 的实例并执行签名操作,但是,在极少数情况下,完全相同的代码路径会返回 RSACryptoServiceProvider 的实例。我们分析了 GetRSAPrivateKey 代码并意识到这一定是由于 CertGetCertificateContextProperty for CertificateProperty.NCryptKeyHandle must Failed

我们添加了日志代码,如果我们没有得到 RSACng,它会执行以下操作:

using (var certificateContext = X509Native.GetCertificateContext(cert))
{
    try
    {
        var result = X509Native.GetCertificateProperty<X509Native.CRYPT_KEY_PROV_INFO>(
                certificateContext,X509Native.CertificateProperty.KeyProviderInfo);
    }
    catch(CryptographicException ex)
    {
         s_log.Info("!! GetCertificateProperty Failed,GetLastError: " + Marshal.GetLastWin32Error(),ex);
    }
}

确实,在这些情况下,CertGetCertificateContextProperty 返回 CRYPT_E_NOT_FOUND,这意味着它没有 KeyProviderInfo。但我们不知道怎么会这样。我们可以很好地使用 RSACryptoServiceProvider,而且 HSM 上的密钥存在且未损坏。我们需要 RSACng 来实现我们的目的,我们能做些什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)