gpt4 book ai didi

c# - 使用纯 .net 框架生成和签署证书请求

转载 作者:行者123 更新时间:2023-12-04 22:37:30 24 4
gpt4 key购买 nike

我正在尝试使用纯 .net 代码来创建证书请求,并根据我可用的现有 CA 证书(在 Windows 证书存储中或作为单独的文件)从证书请求创建证书。
我知道我有类(class) X509CertificateX509Certificate2可用于加载证书并访问其信息,但我在 System.Security.Cryptography 中看不到任何类或功能可用于创建证书请求或签署此类证书请求以创建新签名证书的命名空间。
尽管 documentation on the System.Security.Cryptography.Pkcs namespace说:

The System.Security.Cryptography.Pkcs namespace provides programmingelements for Public Key Cryptography Standards (PKCS), includingmethods for signing data, exchanging keys, requesting certificates,public key encryption and decryption, and other security functions.


那么,我如何创建证书请求并满足该请求以仅使用来自 System.Security.Cryptography 的纯 .net 类来创建新的 X509 证书?

笔记:
  • 我不想使用像 openssl 或 MakeCert
  • 这样的外部可执行文件
  • 我不想使用 BouncyCaSTLe
  • 我不想使用 Windows Certificate Enrollment API
  • 我不想使用 native Win32 API 函数
  • 最佳答案

    简短回答:您可以从 .NET Framework 4.7.2 开始。
    此功能最初以 CertificateRequest 的形式添加到 .NET Core 2.0 中。类,它可以构建 PKCS#10 证书签名请求或 X.509(自签名或链式)公钥证书。
    该功能的类在 .NET Framework 4.7.2 中可用。

    using (RSA parent = RSA.Create(4096))
    using (RSA rsa = RSA.Create(2048))
    {
    CertificateRequest parentReq = new CertificateRequest(
    "CN=Experimental Issuing Authority",
    parent,
    HashAlgorithmName.SHA256,
    RSASignaturePadding.Pkcs1);

    parentReq.CertificateExtensions.Add(
    new X509BasicConstraintsExtension(true, false, 0, true));

    parentReq.CertificateExtensions.Add(
    new X509SubjectKeyIdentifierExtension(parentReq.PublicKey, false));

    using (X509Certificate2 parentCert = parentReq.CreateSelfSigned(
    DateTimeOffset.UtcNow.AddDays(-45),
    DateTimeOffset.UtcNow.AddDays(365)))
    {
    CertificateRequest req = new CertificateRequest(
    "CN=Valid-Looking Timestamp Authority",
    rsa,
    HashAlgorithmName.SHA256,
    RSASignaturePadding.Pkcs1);

    req.CertificateExtensions.Add(
    new X509BasicConstraintsExtension(false, false, 0, false));

    req.CertificateExtensions.Add(
    new X509KeyUsageExtension(
    X509KeyUsageFlags.DigitalSignature | X509KeyUsageFlags.NonRepudiation,
    false));

    req.CertificateExtensions.Add(
    new X509EnhancedKeyUsageExtension(
    new OidCollection
    {
    new Oid("1.3.6.1.5.5.7.3.8")
    },
    true));

    req.CertificateExtensions.Add(
    new X509SubjectKeyIdentifierExtension(req.PublicKey, false));

    using (X509Certificate2 cert = req.Create(
    parentCert,
    DateTimeOffset.UtcNow.AddDays(-1),
    DateTimeOffset.UtcNow.AddDays(90),
    new byte[] { 1, 2, 3, 4 }))
    {
    // Do something with these certs, like export them to PFX,
    // or add them to an X509Store, or whatever.
    }
    }
    }
    如果您停留在旧版本上,请提供更长的答案:要在不添加任何新 P/Invokes 的情况下实现您的目标,您需要阅读并理解以下文档:
  • ITU-T X.680 -201508,ASN.1 语言
  • IETF RFC 5280或 ITU-T X.509 ,解释 X.509 证书中的字段的文档。
  • IETF RFC 2986 ,解释 PKCS#10 认证签名请求
  • ITU-T X.690 ,解释了 ASN.1(包括 DER)的 BER 编码系列,它告诉您如何读取和写入字节以实现 X.509/PKCS#10 的语义。

  • 然后你可以编写一个 DER 写入器/读取器,然后只发出你想要的字节。

    关于c# - 使用纯 .net 框架生成和签署证书请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70136423/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com