如何以编程方式创建有效的自签名X509Certificate2,而不是从.NET Core中的文件加载

Wap*_*pac 19 c# pfx x509certificate2 .net-core

我目前所做的是使用OpenSSL生成PFX文件.这导致了不必要的依赖,特别是对于Windows用户.所以我找到了一些关于如何使用BouncyCastle创建自己的证书的示例,但是这个库不兼容.NET Core(或者我找不到兼容的包).

那么,是否可以仅使用.NET内核创建自己的自签名X509证书,以避免依赖OpenSSL(或任何其他证书生成外部工具)?

编辑:有人(编辑?)建议这个问题如何使用C#创建自签名证书?提供了答案.遗憾的是,这与.NET Core无关.接受的答案从那开始This implementation uses the CX509CertificateRequestCertificate COM object (and friends - MSDN doc) from certenroll.dll to create a self signed certificate request and sign it,显然不是.NET Core ......实际上,没有一个答案是.NET Core兼容的.

Mus*_*ata 23

我发现了另一个让我走上正轨的问题.证书API已添加到2.0版本的.Net Core.我有一个类似下一个的功能来创建自签名证书,我稍后导入我的商店以在IIS上使用它们.

    private X509Certificate2 buildSelfSignedServerCertificate()
    {
        SubjectAlternativeNameBuilder sanBuilder = new SubjectAlternativeNameBuilder();
        sanBuilder.AddIpAddress(IPAddress.Loopback);
        sanBuilder.AddIpAddress(IPAddress.IPv6Loopback);
        sanBuilder.AddDnsName("localhost");
        sanBuilder.AddDnsName(Environment.MachineName);

        X500DistinguishedName distinguishedName = new X500DistinguishedName($"CN={CertificateName}");

        using (RSA rsa = RSA.Create(2048))
        {
            var request = new CertificateRequest(distinguishedName, rsa, HashAlgorithmName.SHA256,RSASignaturePadding.Pkcs1);

            request.CertificateExtensions.Add(
                new X509KeyUsageExtension(X509KeyUsageFlags.DataEncipherment | X509KeyUsageFlags.KeyEncipherment | X509KeyUsageFlags.DigitalSignature , false));


            request.CertificateExtensions.Add(
               new X509EnhancedKeyUsageExtension(
                   new OidCollection { new Oid("1.3.6.1.5.5.7.3.1") }, false));

            request.CertificateExtensions.Add(sanBuilder.Build());

            var certificate= request.CreateSelfSigned(new DateTimeOffset(DateTime.UtcNow.AddDays(-1)), new DateTimeOffset(DateTime.UtcNow.AddDays(3650)));
            certificate.FriendlyName = CertificateName;

            return new X509Certificate2(certificate.Export(X509ContentType.Pfx, "WeNeedASaf3rPassword"), "WeNeedASaf3rPassword", X509KeyStorageFlags.MachineKeySet);
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果你想要pfx,X509Certificate2上的Export函数应该可以解决问题.它返回带有原始pfx数据的字节数组.

  • 寻找这段代码已经有一段时间了。那里有很多不正确的版本。您可以通过将 `request.CertificateExtensions.Add` 替换为 `new Request { CertificateExtensions = { new X509KeyUsageExtension(...), new X509EnhancedKeyUsageExtension(...), sanBuilder.Build() } }` 来简化语法 (3认同)

小智 -9

Microsoft 的方法是使用 makecert 和 pvk2pfx(来自 Windows SDK)来完成此操作,而不是在 .net 代码本身中。现在我对.net core还不是很熟悉,但是由于完整的.net没有原生支持,如果core版本有这个功能的话我会非常惊讶。

以下是如何执行此操作的说明: https ://msdn.microsoft.com/en-us/library/ff699202.aspx

编辑:让我重新表述一下:没有外部依赖项,它在 .net(核心)中不可用。在成熟的 .net 中有一些方法,但您需要外部 dll。