Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CNG(HSM中的私钥)在.NET中创建X.509证书_.net_Bouncycastle_X509_Hsm_Cng - Fatal编程技术网

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

使用CNG(HSM中的私钥)在.NET中创建X.509证书,.net,bouncycastle,x509,hsm,cng,.net,Bouncycastle,X509,Hsm,Cng,我们有一个自签名CA证书,其私钥存储在HSM解决方案中。我们需要创建一个由CA证书通过.NET代码签名的短期X.509证书。短寿命的X.509证书将用于通过TLS/HTTPS对基于REST的服务进行客户端证书身份验证 HSM解决方案使用密钥存储提供程序(KSP)与Microsoft证书存储集成,因此必须使用加密下一代(CNG)库来获取私钥 通过X509CertificateExtensions.GetCngPrivateKey()我们可以访问 表示私钥的CngKey对象 但是,我们不能将CngK

我们有一个自签名CA证书,其私钥存储在HSM解决方案中。我们需要创建一个由CA证书通过.NET代码签名的短期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,有人回应如何将其作为框架的一部分实施。

如果我们知道您计划如何使用密钥(用于哪些应用程序或任务),那就更好了。我不熟悉BouncyCastle,但应该有一个API可以接受
HCRYPTKEY
句柄。添加了“短寿命的X.509证书将用于通过TLS/HTTPS对基于REST的服务进行客户端证书身份验证。”以澄清:您到底想如何使用该密钥?签署这个短期证书?在这种情况下,我建议使用CA服务来签署短期证书。在这种情况下,CA将负责所有事情。您只需要从客户端准备CSR。我们有一个自签名CA证书(不是CA服务),它在HSM中有私钥。基于REST的服务通过TLS/HTTPS信任此自签名CA证书。我们的应用程序接收一个带有kerberos身份验证的TLS/HTTPS请求,并将基于此作为基于REST的服务请求的代理。由于基于REST的服务只支持X.509客户端证书,因此我们会动态生成一个使用CA证书的私钥签名的X.509证书。好的,我实现了您的最终目标。但是…不是CA服务?根据您的帖子:
HSM解决方案正在使用密钥存储提供商(KSP)与Microsoft证书服务集成
。如果没有,则应使用CA服务(ADC或任何您喜欢的服务)执行证书签名操作。不要重新发明轮子。如果我们知道您计划如何使用钥匙(用于什么应用程序或任务),那就更好了。我不熟悉BouncyCastle,但应该有一个API可以接受
HCRYPTKEY
句柄。添加了“短寿命的X.509证书将用于通过TLS/HTTPS对基于REST的服务进行客户端证书身份验证。”以澄清:您到底想如何使用该密钥?签署这个短期证书?在这种情况下,我建议使用CA服务来签署短期证书。在这种情况下,CA将负责所有事情。您只需要从客户端准备CSR。我们有一个自签名CA证书(不是CA服务),它在HSM中有私钥。基于REST的服务通过TLS/HTTPS信任此自签名CA证书。我们的应用程序接收一个带有kerberos身份验证的TLS/HTTPS请求,并将基于此作为基于REST的服务请求的代理。由于基于REST的服务只支持X.509客户端证书,因此我们会动态生成一个使用CA证书的私钥签名的X.509证书。好的,我实现了您的最终目标。但是…不是CA服务?根据您的帖子:
HSM解决方案正在使用密钥存储提供商(KSP)与Microsoft证书服务集成
。如果没有,则应使用CA服务(ADC或任何您喜欢的服务)执行证书签名操作。不要重新发明轮子。