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

问题描述 投票:0回答:3

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

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

编辑:有人(编辑?)建议这个SO问题如何使用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 兼容。

c# .net-core x509certificate2 pfx
3个回答
61
投票

我发现另一个SO问题让我走上了正确的道路。 .Net Core 2.0 版本中添加了证书 API。我有一个类似于下一个的函数来创建自签名证书,稍后将其导入到 My 存储中以在 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 上的导出功能应该可以解决问题。它返回一个包含原始 pfx 数据的字节数组。


0
投票

-9
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.