如何在.net中创建一个全新的x509Certificate2?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (9)

我从网络上谷歌它,找到许多样品,以生成一个新的x509Certificate2从.net中的文件,但没有一个示例来展示如何从.net开始生成一个全新的x509Certificate2。

有没有人可以告诉我如何在.net中执行此操作?

提问于
用户回答回答于

可以使用PINVOKE调用Crypt32来创建自签名证书。有一些示例代码可用,它们将生成一个并将其放入证书存储库中供您使用。

还有Keith Brown的证书生成器,它是用托管代码编写的,并有一个可以使用的库

或者,可以使用BouncyCastle,Org.BouncyCastle.X509.X509V3CertificateGenerator并使用Org.BouncyCastle.Security.DotNetUtilities和调用中的实用工具方法ToX509Certificate()

如果你想创建一个请求,并让它由一个在.NET中更容易实现的CA签名,因为大多数这些类都可以作为COM interop DLL导入。但这是另外一个问题。

用户回答回答于

下面是可以使用的代码:

    static X509Certificate2 GenerateCertificate(string certName)
    {
        var keypairgen = new RsaKeyPairGenerator();
        keypairgen.Init(new KeyGenerationParameters(new SecureRandom(new CryptoApiRandomGenerator()), 1024));

        var keypair = keypairgen.GenerateKeyPair();

        var gen = new X509V3CertificateGenerator();

        var CN = new X509Name("CN=" + certName);
        var SN = BigInteger.ProbablePrime(120, new Random());

        gen.SetSerialNumber(SN);
        gen.SetSubjectDN(CN);
        gen.SetIssuerDN(CN);
        gen.SetNotAfter(DateTime.MaxValue);
        gen.SetNotBefore(DateTime.Now.Subtract(new TimeSpan(7, 0, 0, 0)));
        gen.SetSignatureAlgorithm("MD5WithRSA");
        gen.SetPublicKey(keypair.Public);           

        var newCert = gen.Generate(keypair.Private);

        return new X509Certificate2(DotNetUtilities.ToX509Certificate((Org.BouncyCastle.X509.X509Certificate)newCert));
    }

若要使此工作正常,请不要忘记添加引用BouncyCastle 库

扫码关注云+社区