问题描述
我们正在使用 .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 (将#修改为@)