c# - Asociar una clave privada con la clase X509Certificate2 en.net
ssl (2)
Para todos los demás con el mismo problema, encontré un buen pedazo de código que te permite hacer exactamente eso:
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;
Estoy trabajando en un código que crea un certificado X509 y un par de claves pública / privada. La clave pública se agrega al certificado y se envía a una CA que la firma.
El certificado devuelto se accede a través de la clase System.Security.Cryptography.X509Certificates.X509Certificate2. Ahora quiero usar este certificado para iniciar una conexión segura con otros clientes. Por lo tanto, uso la clase SslStream. Para iniciar el protocolo de enlace SSL, uso este método:
server.AssociatedSslStream.AuthenticateAsServer(
MyCertificate, // Client Certificate
true, // Require Certificate from connecting Peer
SslProtocols.Tls, // Use TLS 1.0
false // check Certificate revocation
);
Este método requiere que la clave privada esté asociada con el certificado. Por supuesto, el certificado devuelto por la CA no contiene una clave privada. Pero está almacenado como archivo .key en el disco duro. La clase X509Certificate2 tiene una propiedad llamada PrivateKey que supongo que asociará una clave privada con el certificado, pero no puedo encontrar una manera de establecer esta propiedad.
¿Hay alguna manera de asociar la clave privada con la clase .net X509?
Puede ahorrarse la molestia de copiar y pegar todo ese código y almacenar la clave privada junto al certificado en un pfx
/ pkcs#12
:
openssl pkcs12 -export -in my.cer -inkey my.key -out mycert.pfx
Deberá proporcionar una contraseña, que debe pasar al constructor de X509Certificate2
:
X509Certificate2 cert = new X509Certificate2("mycert.pfx","password");