当前位置: 首页 > 知识库问答 >
问题:

使用纯.NET Framework生成和签名证书请求

百里沛
2023-03-14

我正在尝试使用纯.NET代码创建证书请求,并根据现有的CA证书(在Windows证书html" target="_blank">存储中或作为单独的文件)从证书请求创建证书。

我知道有类X509CertificeX509Certificate2可用于加载证书并访问它们的信息,但在System.Security.Cryptography命名空间中没有任何类或功能可用于创建证书请求或对此类证书请求进行签名以创建新的已签名证书。

并且尽管system.security.cryptography.pkcs命名空间的文档说明:

System.security.Cryptography.PKCS命名空间为公钥加密标准(PKCS)提供编程元素,包括签名数据、交换密钥、请求证书、公钥加密和解密以及其他安全功能的方法。

那么,如何仅使用System.Security.Cryptography中的纯.NET类创建证书请求并对该请求进行签名以创建新的X509证书呢?

  • 我不想使用诸如openssl或MakeCert之类的外部可执行文件
  • 我不想使用BouncyCastle
  • 我不想使用Windows证书注册API
  • 我不想使用本机Win32 API函数

共有1个答案

郗唯
2023-03-14

简短回答:您可以从.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写入器/读取器,只需发出您想要的字节。

 类似资料:
  • 本文档提供使用 openssl 生成自签名证书的一个示例,用户也可以根据自己的需求生成符合要求的证书和密钥。 假设实例集群拓扑如下: Name Host IP Services node1 172.16.10.11 DM-master1 node2 172.16.10.12 DM-master2 node3 172.16.10.13 DM-master3 node4 172.16.10.14 DM

  • 我四处寻找,但没有找到一个明确的例子。我想以编程方式(C#)创建一个自签名(自)信任的证书,执行以下步骤: 步骤1: 即时创建根CA证书并将其添加到“受信任的根证书颁发机构”文件夹中的证书存储中 我做到了(参见下面的代码-步骤1)。如何完成第2步?目标计算机是Windows XP/7。 我尝试了纯.NET方法和Bouncy Castle库。

  • 我是不是漏掉了什么?这是构建自签名证书的正确方法吗?

  • 本文向大家介绍纯Java实现数字证书生成签名的简单实例,包括了纯Java实现数字证书生成签名的简单实例的使用技巧和注意事项,需要的朋友参考一下 以上这篇纯Java实现数字证书生成签名的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 我想在JettyDistribution-9.2.9.v20150224上配置SSL 并将ssl和https模块配置为start.ini,Jetty工作正常。 但是,从keystore中提取的证书不能被浏览器信任。所以我想使用Openssl创建自签名证书 我的Openssl版本是0.9.8,我通过以下步骤生成keystore: 但是,这个TrustStore.KeyStore不能工作。Http工作