我需要生成证书签名请求文件,以便提交给第三方机构。
我显然错过了一条阻碍我从成功创建的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中。
所以:
那究竟是什么我错过了??
答案 0 :(得分:0)
CSR是证书签名请求。它包含公钥和您希望证书包含的任何元数据。然后,第三方(通常是证书颁发机构,即CA)从中创建证书并向您提供证书。 所以你的订单是错的。
CSR通常以PKCS#10格式提供给第三方/ CA.如果您想自己真正编写该部分,为CSR创建ASN.1 / DER需要大量的努力。 RFC2986为您提供了创建CSR的确切规范。
由于您的方案涉及HSM,并且必须签署CSR,您必须使用您的Cng提供商来获取包含在CSR中的签名。
.Net(或Win32 crypto / bcrypt)中没有API允许您“简单地调用函数”并为您生成CSR。
另请注意,CSR包含您请求在您的证书中的内容。 CA可以选择更改或跳过您提供的任何信息以包含在证书中。