Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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
C# 使用Azure密钥库签署CSR_C#_Azure_Azure Keyvault - Fatal编程技术网

C# 使用Azure密钥库签署CSR

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()函数?

如何使用Azure Key Vault实现非常基本的CSR签名HSM功能

我找到了一个非常漫长的手动过程来实现它:

  • 在密钥库中创建私钥
  • 创建一个CSR,用SHA256消化它
  • 使用Sign()方法使用上一个私钥对摘要进行签名
  • 创建本地x.509证书并附加签名
  • 将新签名证书上载到密钥保管库
  • 问题是,它是手动的,很长(还有相当长的延迟)而且容易出错。此外,我还没有找到一个C#代码的例子,我正在寻找EC而不是RSA

    问题是,密钥库中是否有一个简单的CertificateRequest.Sign()函数?对于类似HSM的服务来说,这似乎非常基本


    谢天谢地,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)?