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

时间:2017-03-14 13:12:58

标签: c# .net-core x509certificate2 pfx

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

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

编辑:有人(编辑?)建议此问题How to create a self-signed certificate using 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兼容。

2 个答案:

答案 0 :(得分:13)

我发现this other SO question让我走上正轨。证书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);
        }
    }

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

答案 1 :(得分:-4)

Microsoft的方法是使用makecert和pvk2pfx(来自Windows SDK),而不是.net代码本身。现在我对.net核心并不是很熟悉,但是由于完整的.net并没有本机支持,如果核心版本确实具有该功能,我会非常惊讶。

这里是如何做到这一点的描述: https://msdn.microsoft.com/en-us/library/ff699202.aspx

编辑:让我重新说一下:没有外部依赖,它在.net(核心)中不可用.. 有很多方法可以完全吹制.net但你需要外部的dll。