creo que hay dos partes a la pregunta:
- ¿cómo puede recuperar el certificado
- del servidor ¿Cómo se recupera la cadena del certificado
Para rertrieve el certificado del servidor que utilice SslStream cuyos métodos son similares a .NET propio SslStream
var serverName = "...;
var client = new TcpClient(serverName, 443);
// Create an SSL stream that will close the client's stream.
using (var sslStream = new SslStream(client.GetStream(),true))
{
sslStream.AuthenticateAsClient(serverName);
var serverCertificate = sslStream.RemoteCertificate;
}
Parece que OpenSSL.Net no puede recuperar la cadena de un certificado. El parámetro -showcerts usa la función SSL_get_peer_cert_chain que no está implementada en OpenSSL.NET.
Si no le molesta mezclar OpenSSL.Net y las clases incorporadas .NET, puede convertir un certificado OpenSSL.Net en un certificado .NET y recuperar la cadena utilizando .NET X509Chain.Build. Puede convertir los certificados .NET a certificados OpenSSL.NET utilizando la propiedad RawData del certificado .NET.
var managedCert = new System.Security.Cryptography.X509Certificates.X509Certificate2(serverCertificate.DER);
var chain = new System.Security.Cryptography.X509Certificates.X509Chain();
chain.Build(managedCert);
foreach (var element in chain.ChainElements)
{
var raw = element.Certificate.RawData;
using (var bio = new BIO(raw))
{
var oc = OpenSSL.X509.X509Certificate.FromDER(bio);
}
}
Tal vez se puede utilizar el objeto SslStream y X509Certificate2 de .NET para hacer lo que desee con los datos del certificado primas sin usar OpenSSL.Net en absoluto.
Eso suena muy prometedor - ¡Gracias! – KenD
[Utilice una CA particular para una conexión SSL] (http://stackoverflow.com/questions/22516450/use-a-particular-ca-for-a-ssl-connection/23180787#23180787) evitará el CA Zoo del almacén de certificados de Windows para la verificación. Sin embargo, deberá proporcionar una CA confiable para verificar la cadena. Si conoce la CA que emitió el certificado, entonces es mejor utilizar solo una CA en lugar de los cientos. disponible – jww
@jww su proposición es un riesgo de seguridad que ya ha sido explotado en numerosas ocasiones, más recientemente como consecuencia del exploit Heartbleed. Los certificados de CA * han sido * comprometidos y revocados en el pasado. Al usar un almacenamiento local como CA no tienes forma de o f validando el certificado o sabiendo que ha sido revocado. No hay "CA Zoo", es solo la forma en que funcionan los certificados. –