我们有一个自签名的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,并就如何将其作为框架的一部分实施做出回应。