【发布时间】:2015-09-02 02:26:48
【问题描述】:
我需要生成证书签名请求文件,以提交给第三方机构。
我显然遗漏了一条知识,它阻止我从我已成功创建的 CngKey 和/或 X509Certificate2 对象以及 Base64 编码的 ASN.1/DER 证书签名请求中实现认知飞跃.
我对@987654324@(和等价物)所做的所有搜索都告诉我如何创建自签名证书。但是,我不认为这正是我需要的(或者是吗?)。
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 中。
原来如此:
- 生成私钥
- 从密钥生成证书
- 存储证书
- ???
- 将 CSR 发送给第三方
- 利润。
那么我到底错过了什么……?
【问题讨论】:
标签: c# .net certificate pki