C# 使用Azure密钥库签署CSR
如何使用Azure Key Vault实现非常基本的CSR签名HSM功能 我找到了一个非常漫长的手动过程来实现它:C# 使用Azure密钥库签署CSR,c#,azure,azure-keyvault,C#,Azure,Azure Keyvault,如何使用Azure Key Vault实现非常基本的CSR签名HSM功能 我找到了一个非常漫长的手动过程来实现它: 在密钥库中创建私钥 创建一个CSR,用SHA256消化它 使用Sign()方法使用上一个私钥对摘要进行签名 创建本地x.509证书并附加签名 将新签名证书上载到密钥保管库 问题是,它是手动的,很长(还有相当长的延迟)而且容易出错。此外,我还没有找到一个C#代码的例子,我正在寻找EC而不是RSA 问题是,密钥库中是否有一个简单的CertificateRequest.Sign()函数?
谢天谢地,KV有一个标志操作,但它并不特定于任何数据类型(如证书请求) NET SDK提供了这一功能,它只是RESTAPI的包装器 这并不是您想要的,但我编写了一些代码来演示C#KV加密/解密,这将帮助您入门描述了他创建的解决方案,该解决方案使用C#/.NET Core实现了上面列出的步骤 代码可在以下位置获得: 其核心是:
byte[]certificateRequest=/*…*/;
字符串issuerCertificateName=/*…*/;
KeyVaultServiceClient KeyVaultServiceClient=/*…*/;
X509SignatureGenerator generator=/*见下一节*;
var pkcs10CertificationRequest=新的pkcs10CertificationRequest(certificateRequest);
//TODO:通过pkcs10CertificationRequest.Verify()验证CSR
var info=pkcs10CertificationRequest.GetCertificationRequestInfo();
var notBefore=DateTime.UtcNow.AddDays(-1);
//从CSR获取RSA公钥
var asymmetricKeyParameter=Org.BouncyCastle.Security.PublicKeyFactory.CreateKey(info.SubjectPublicKeyInfo);
var rsaKeyParameters=(Org.BouncyCastle.Crypto.Parameters.rsaKeyParameters)asymmetricKeyParameter;
var rsaKeyInfo=新的rsaKeyInfo参数
{
模数=RSAKEParameters.module.ToByteArrayUnsigned(),
Exponent=rsaKeyParameters.Exponent.ToByteArrayUnsigned()
};
var publicKey=RSA.Create(rsaKeyInfo);
//TODO:验证公钥
var certBundle=await keyVaultServiceClient.GetCertificateAsync(issuerCertificateName).ConfigureAwait(false);
var signingCert=新X509Certificate2(certBundle.Cer);
//新序列号
var serialNumber=新字节[SerialNumberLength];
RandomNumberGenerator.Fill(序列号);
序列号[0]&=0x7F;
var subjectDN=新的X500区分名称(subjectName);
var请求=新证书请求(subjectDN、publicKey、GetRSAHashAlgorithmName(hashSizeInBits)、rsasignatureadding.Pkcs1);
//基本约束条件
request.CertificateExtensions.Add(
新的X509BasicConstraintExtension(caCert,caCert,0,true));
//主题密钥标识符
var ski=新X509SubjectKeyIdentifierExtension(
request.PublicKey,
X509SubjectKeyIdentifierHashAlgorithm.Sha1,
假);
请求。证书扩展。添加(ski);
//授权密钥标识符
如果(issuerCAKeyCert!=null)
request.CertificateExtensions.Add(BuildAuthorityKeyIdentifier(issuercakeCert));
其他的
Add(BuildAuthorityKeyIdentifier(subjectDN,serialNumber.Reverse().ToArray(),ski));
如果(caCert)
request.CertificateExtensions.Add(
新X509KeyUsageExtension(
X509KeyUsageFlags.DigitalSignature|
X509KeyUsageFlags.KeyCertSign|
X509KeyUsageFlags.CrlSign,
是的);
其他的
{
//关键用法
var默认标志=
X509KeyUsageFlags.DigitalSignature|
X509KeyUsageFlags.DataEncryption|
X509KeyUsageFlags.Nonpudiation|
X509KeyUsageFlags.KeyEncryption;
添加(新的X509KeyUsageExtension(defaultFlags,true));
//增强的密钥使用
request.CertificateExtensions.Add(
新X509EnhancedKeyUsageExtension(
新收藏{
新Oid(“1.3.6.1.5.5.7.3.1”),
新Oid(“1.3.6.1.5.5.7.3.2”)},正确);
}
如果(issuerCAKeyCert!=null)
{
如果(notAfter>issuercakecycert.notAfter)
{
notAfter=issuercakecycert.notAfter;
}
如果(不在<发卡行账户开始日期之前)
{
notBefore=发卡行账户。notBefore;
}
}
var issuerSubjectName=issuercakecycert!=无效的IssuerMakeCert.SubjectName:subjectDN;
X509Certificate2 signedCert=请求。创建(
发行人主体名称,
发电机,
以前没有,
之后,
序列号);
和使用了以下密钥Vault SDK方法:
HashAlgorithm hash=/*参见GitHub*/;
var digest=hash.ComputeHash(数据);
var resultKeyVaultPkcs=await keyVaultClient.SignAsync(signingKey,algorithm,digest,rsasignatureadding.Pkcs1);
希望您可以修改此代码以满足您的需要。我也会这么做的。谢谢不幸的是,这是一个非常简单的KV代码,我正在寻找一个x509签名特定的代码,它将负责签名、构建签名证书等。。。在ECDSA中。无论如何谢谢你!我确实试过了,但这与我的要求相去甚远!谢谢。您好,您解决了这个问题吗?没有,SO中似乎没有人知道答案。您是否取得了任何成功,或者您是否可以共享为手动执行这些步骤而编写的任何代码(即使使用RSA)?