c# - 从 CngKey 或 X509Certificate(2) 实例生成 CSR

标签 c# .net certificate pki

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

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

我对 c# generate csr(和等价物)所做的所有搜索告诉我如何创建一个自签名证书。但是,我不认为这正是我需要的(或者是吗?)

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. 从 key 生成证书
  3. 保存证书
  4. ???
  5. 将 CSR 发送给第三方
  6. 利润。

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

最佳答案

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

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

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

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

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

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

关于c# - 从 CngKey 或 X509Certificate(2) 实例生成 CSR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30881647/

相关文章:

c# - 如何在 .NET 4.5 中运行这两种方法 'at the same time'?

c# - 以编程方式打印文档

java - tomcat 中的 SSL 实现给出消息,因为服务器的证书不受信任

authentication - 双向 SSL 验证

php - 不破解 CurlException : 60 (cURL SSL Certificate Verification)

c# - .Net核心3 : The namespace internal does not exist in Microsoft.扩展.日志记录.内部

c# - 用 Func 替换 MongoDB 查询中的 lambda 表达式

c# - 在 Task.Run 中使用 CancellationToken 超时不起作用

c# - 如何更新ajax请求中的状态标签

c# - 设置文件路径以引用解决方案或项目根目录下的文件