Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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 create your own certificate using BouncyCastle, but this library is not .NET Core compatible (or I failed to find the compatible package).

So, is it possible to create your own self signed X509 certificate using just .NET core to avoid dependency on OpenSSL (or any other certificate generating external tool)?

EDIT: It was suggested by someone (editor?) that this SO question How to create a self-signed certificate using C#? provides an answer. Sadly again, this has nothing to do with .NET Core. The accepted answer there starts with This implementation uses the CX509CertificateRequestCertificate COM object (and friends - MSDN doc) from certenroll.dll to create a self signed certificate request and sign it, which is obviously NOT .NET Core ... In fact, none of the answers there is .NET Core compatible.

like image 997
Wapac Avatar asked Mar 14 '17 13:03

Wapac


People also ask

How can I create a self-signed certificate using C #?

2 you can create self-signed certs using System. Security. Cryptography. X509Certificates.

What is x509certificate C#?

The X509Certificates class is mainly used to generate a certificate for an individual solution. The System. Security. Cryptography. X509Certificates namespace contains the common language run time implementation of the Authenticode X.

How do I create a certificate in Visual Studio?

Step 1 - Create the Certificate RequestOpen Visual Studio, go to the Icenium menu and choose Options. From there, switch to the "Certification Management" tab. Towards the bottom , click the "Create" button in the "Pending Certificates" section. You will be prompted to save a certificate signing request (.


1 Answers

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.

like image 96
Monticola Explorator Avatar answered Sep 30 '22 07:09

Monticola Explorator