我需要生成证书签名请求文件,以提交给第三方机构。
我显然遗漏了一条知识,阻止我从我成功创建的 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 中也是如此。
是这样的:
- 生成私钥
- 从 key 生成证书
- 保存证书
- ???
- 将 CSR 发送给第三方
- 利润。
那么我到底错过了什么......?
最佳答案
CSR 是证书签名请求。它包含公钥和您希望证书包含的任何元数据。第三方(通常是证书颁发机构 aka CA)然后从中创建证书并将证书提供给您。 所以你的订单是错误的。
- 生成私钥
- 生成 CSR
- 将 CSR 发送给第三方
- 从第三方接收证书
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/