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

C# 如何以编程方式创建有效的自签名X509Certificate2,而不是从.NET Core中的文件加载,c#,.net-core,x509certificate2,pfx,C#,.net Core,X509certificate2,Pfx,我现在做的是使用OpenSSL生成PFX文件。这会导致不必要的依赖性,尤其是对于Windows用户。因此,我找到了一些关于如何使用BouncyCastle创建您自己的证书的示例,但是这个库与.NET Core不兼容(或者我找不到兼容的包) 那么,是否可以仅使用.NET内核创建您自己的自签名X509证书,以避免依赖OpenSSL(或任何其他生成证书的外部工具) 编辑:有人(编辑?)建议,这个问题提供了答案。遗憾的是,这与.NETCore毫无关系。这里接受的答案以开始。此实现使用certenroll

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

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


编辑:有人(编辑?)建议,这个问题提供了答案。遗憾的是,这与.NETCore毫无关系。这里接受的答案以
开始。此实现使用certenroll.dll中的CX509CertificateRequestCertificate COM对象(和friends-MSDN doc)创建自签名证书请求并对其签名
,这显然不是.NET Core。。。事实上,没有一个答案与.NET核心兼容。

微软的做法是使用makecert和pvk2pfx(来自windows SDK),而不是使用.NET代码本身。现在我对.net核心不是很熟悉,但是由于成熟的.net没有本机支持,如果核心版本真的有这个功能,我会非常惊讶

以下是如何做到这一点的说明:

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

我发现这让我走上了正确的道路。证书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上的导出功能应该可以实现。它返回一个包含原始pfx数据的字节数组。

可能的技术副本尚未出现-“此机制在
.NET Core上尚不可用。
”-抱歉,但同样,这不是很有用。我甚至可以使用OpenSSL跨平台生成PFX证书。问题是如何避免外部依赖,即如何通过编程创建这样的证书;我刚刚给了你一个“微软最佳实践”的链接,以表明这不仅仅是我的直觉,而且不是他们设计它的方式。如果它是一个本机函数,人们会认为这是他们的答案,而不是一些SDK工具。很抱歉没有说得足够具体。这篇文章可能已经有5-7年的历史了(它引用了Visual Studio 2010作为最新版本)。那一年,没有.NET内核。如何在Linux上运行pvk2pfx?这是不对的。甚至使用OpenSSL也比这好得多。我们已经寻找这段代码很久了。有很多不正确的版本。您可以通过将
request.CertificateExtensions.Add
替换为
newrequest{CertificateExtensions={new X509KeyUsageExtension(…),new X509EnhancedKeyUsageExtension(…),sanBuilder.Build()}来简化语法