【问题标题】:Generating a CSR from a CngKey or X509Certificate(2) instance从 CngKey 或 X509Certificate(2) 实例生成 CSR
【发布时间】:2015-09-02 02:26:48
【问题描述】:

我需要生成证书签名请求文件,以提交给第三方机构。

我显然遗漏了一条知识,它阻止我从我已成功创建的 CngKey 和/或 X509Certificate2 对象以及 Base64 编码的 ASN.1/DER 证书签名请求中实现认知飞跃.

我对@9​​87654324@(和等价物)所做的所有搜索都告诉我如何创建自签名证书。但是,我不认为这正是我需要的(或者是吗?)

CngKey 对象是使用硬件安全模块生成的私钥创建的,因此:

var parameters = new CngKeyCreationParameters
{
    Provider = "The HSM's ECDSA Provider",
    ExportPolicy = CngExportPolicies.AllowArchiving,
    KeyCreationOptions = CngKeyCreationOptions.None,
    KeyUsage = CngKeyUsages.Signing,
    UIPolicy = new CngUIPolicy(CngUIProtectionLevels.ForceHighProtection)
};
var key = CngKey.Create(CngAlgorithm.ECDsaP256, keyName, parameters);

使用来自http://clrsecurity.codeplex.com/System.Cryptography 扩展,我可以构建一个自签名证书:

var dn = new X500DistinguishedName("CN=MyCompany;OU=MyOrgUnit;OID.2.25.4.45=MyUniqueID");

var certParams = new X509CertificateCreationParameters(dn)
{
    SignatureAlgorithm = X509CertificateSignatureAlgorithm.ECDsaSha256,
};

var cert = key.CreateSelfSignedCertificate(certParams);

我什至可以将它存储到证书注册请求存储中:

var store = new X509Store("REQUEST", StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite);
store.Add(cert);
store.Close();

但是,从那里我被卡住了。

我尝试过Convert.ToBase64String(cert.Export(X509ContentType.Cert))(以及X509ContentType 的其他值),但这些似乎无效(我使用openssl req 进行的冒烟测试会引发一堆ASN.1 错误)。

到目前为止,我宁愿不必使用像 BouncyCastle 或 OpenSSL.NET 这样的第三方库进行重写,部分原因是缺乏文档,部分原因是与 HSM 的交互。同样,我无法将私钥从 HSM 导出(因为,如果可以的话,HSM 的意义何在?)。

如果可以的话,我只会使用常规的 Windows 证书 MMC,但我需要提供一个 ASN.1 BIT STRING 作为主题的一部分(为简洁起见,我已经从上面排除了它的生成),并且我似乎无法使用标准的创建自定义请求对话框来做到这一点。

但是,该对话框可以创建所需的 CSR 文件格式,因此该功能必须存在于某个地方,即使它隐藏在 Win32 API 中。

原来如此:

  1. 生成私钥
  2. 从密钥生成证书
  3. 存储证书
  4. ???
  5. 将 CSR 发送给第三方
  6. 利润。

那么我到底错过了什么……?

【问题讨论】:

    标签: c# .net certificate pki


    【解决方案1】:

    CSR 是证书签名请求。它包含公钥和您希望证书包含的任何元数据。然后第三方(通常是证书颁发机构,又名 CA)从中创建证书并向您提供证书。 所以你的订单是错误的。

    1. 生成私钥
    2. 生成 CSR
    3. 将 CSR 发送给第三方
    4. 从第三方接收证书

    CSR 通常以 PKCS#10 格式提供给第三方/CA。如果您想真正自己编写该部分,则为 CSR 创建 ASN.1/DER 需要付出很多努力。 RFC2986 为您提供创建 CSR 的确切规范。

    由于您的方案涉及 HSM,并且必须对 CSR 进行签名,因此您必须使用 Cng 提供程序来获取要包含在 CSR 中的签名。

    .Net(或 Win32 crypto/bcrypt)中没有 API 可以让您“简单地调用一个函数”并为您生成 CSR。

    另外,请注意,CSR 包含您请求在您的证书中的内容。 CA 可以选择更改或跳过您提供的任何信息以包含在证书中。

    【讨论】:

      猜你喜欢
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 2022-01-04
      • 2016-01-29
      • 1970-01-01
      • 2013-07-24
      相关资源
      最近更新 更多