使用CNG在HSM中创建X.509证书(HSM中的私钥)

时间:2017-01-24 09:16:45

标签: .net bouncycastle x509 hsm cng

我们有一个自签名的CA证书,其私钥存储在HSM解决方案中。我们需要通过.NET代码创建由CA证书签名的短期X.509证书。短期X.509证书将用于通过TLS / HTTPS对基于REST的服务进行客户端证书身份验证。

HSM解决方案使用密钥存储提供程序(KSP)与Microsoft证书存储区集成,因此必须使用加密下一代(CNG)库来获取私钥。

通过X509CertificateExtensions.GetCngPrivateKey(),我们可以访问 表示私钥的CngKey对象。

但是,我们无法将CngKey与BouncyCastle一起使用

AsymmetricCipherKeyPair issuerKeyPair=null;
if (issuerCertificate.HasCngKey())
{
   var cngPrivateKey = issuerCertificate.GetCngPrivateKey();
   var rsa = new RSACng(cngPrivateKey);

   issuerKeyPair = DotNetUtilities.GetRsaKeyPair(privateKey);
}

因抛出以下异常而失败

System.Security.Cryptography.CryptographicException: Invalid type specified.

   at System.Security.Cryptography.NCryptNative.ExportKey(SafeNCryptKeyHandle key, String format)
   at System.Security.Cryptography.CngKey.Export(CngKeyBlobFormat format)
   at System.Security.Cryptography.RSACng.ExportParameters(Boolean includePrivateParameters)

编辑:想想这个失败的原因,是DotNetUtilities.GetRsaKeyPair尝试通过rsa.ExportParameters(true)导出私钥。 HSM不允许这样做,它会引发异常。似乎需要一种不同的方式来引用私钥

编辑#2:向Bouncy Castle提出feature request,并就如何将其作为框架的一部分实施做出回应。

0 个答案:

没有答案