从CngKey或X509Certificate(2)实例

时间:2015-06-17 03:06:10

标签: 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. 从密钥生成证书
  3. 存储证书
  4. ???
  5. 将CSR发送给第三方
  6. 利润。
  7. 那究竟是什么我错过了??

1 个答案:

答案 0 :(得分:0)

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

  1. 生成私钥
  2. 生成CSR
  3. 将CSR发送给第三方
  4. 从第三方获得证书
  5. CSR通常以PKCS#10格式提供给第三方/ CA.如果您想自己真正编写该部分,为CSR创建ASN.1 / DER需要大量的努力。 RFC2986为您提供了创建CSR的确切规范。

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

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

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