How to create a valid, self-signed X509Certificate2 programmatically, not loading from file in .NET Core

后端 未结 2 1095
孤独总比滥情好
孤独总比滥情好 2020-12-28 14:04

What I currently do is that I use OpenSSL to generate PFX file. This is causing an unwanted dependency, especially for Windows users. So I found some examples on how to crea

相关标签:
2条回答
  • 2020-12-28 14:49

    The Microsoft way is doing this with makecert and pvk2pfx (from the windows SDK), and not in the .net code itself. Now Im not very familiar with .net core, but since the full blown .net doesn't have native support, it would surprise me very much if the core version does have the function.

    here's a description of how to do that: https://msdn.microsoft.com/en-us/library/ff699202.aspx

    Edit: Let me rephrase it: Without external dependancies it is not available in .net (core).. There are ways in full blown .net but you need external dll's for that.

    0 讨论(0)
  • 2020-12-28 15:00

    I found this other SO question that put me on the right track. Certificates API was added to .Net Core on 2.0 version. I have a function like the next one to create self signed certificates that I later import into My store to use them on 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);
            }
        }
    

    If you want the pfx, the Export function on X509Certificate2 should do the trick. It returns a byte array with the raw pfx data.

    0 讨论(0)
提交回复
热议问题