Associate A Private Key With The X509Certificate2 Class In .net


Answer :

You can save yourself the hassle of copy-pasting all that code and store the private key next to the certificate in a pfx/pkcs#12 file:

openssl pkcs12 -export -in my.cer -inkey my.key -out mycert.pfx 

You'll have to supply a password, which you have to pass to the constructor of X509Certificate2:

X509Certificate2 cert = new X509Certificate2("mycert.pfx","password"); 

For everyone else with the same problem, I found a neat little piece of code that let's you do exactly that:

http://www.codeproject.com/Articles/162194/Certificates-to-DB-and-Back

byte[] certBuffer = Helpers.GetBytesFromPEM(publicCert, PemStringType.Certificate); byte[] keyBuffer  = Helpers.GetBytesFromPEM(privateKey, PemStringType.RsaPrivateKey);  X509Certificate2 certificate = new X509Certificate2(certBuffer, password);  RSACryptoServiceProvider prov = Crypto.DecodeRsaPrivateKey(keyBuffer); certificate.PrivateKey = prov; 

EDIT: The code for the Helper method (which otherwise requires a codeproject login) is as follows:

public static byte[] GetBytesFromPEM(string pemString, PemStringType type) {     string header; string footer;     switch (type)     {         case PemStringType.Certificate:             header = "-----BEGIN CERTIFICATE-----";             footer = "-----END CERTIFICATE-----";             break;         case PemStringType.RsaPrivateKey:             header = "-----BEGIN RSA PRIVATE KEY-----";             footer = "-----END RSA PRIVATE KEY-----";             break;         default:             return null;     }      int start = pemString.IndexOf(header) + header.Length;     int end = pemString.IndexOf(footer, start) - start;     return Convert.FromBase64String(pemString.Substring(start, end)); } 

my solution

 byte[] PublicCertificate = Encoding.Unicode.GetBytes("-----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----");  var publicCertificate = new X509Certificate2(PublicCertificate );  byte[] PrivateKey = Convert.FromBase64String("MIIEvQIBA...=");  using var rsa = RSA.Create();  rsa.ImportPkcs8PrivateKey(PrivateKey, out _);  publicCertificate = publicCertificate.CopyWithPrivateKey(rsa);  publicCertificate = new X509Certificate2(publicCertificate.Export(X509ContentType.Pkcs12));   var client = new RestClient("api_url");  client.ClientCertificates = new X509Certificate2Collection();  client.ClientCertificates.Add(publicCertificate); 

Comments

Popular posts from this blog

Are Regular VACUUM ANALYZE Still Recommended Under 9.1?

Can Feynman Diagrams Be Used To Represent Any Perturbation Theory?