2012-05-10 15 views
7

me gustaría utilizar el contenedor OpenSSL .Net para recuperar un certificado desde un servidor remoto a mi código C#. En esencia, me gustaría replicarcertificado mediante OpenSSL .Net

openssl s_client -connect 192.168.254.13:636 -showcerts 

.. y última traer los resultados en un X509Certificate. ¿Es esto posible? De ser así, ¿puede alguien señalarme la dirección correcta?

Respuesta

6

creo que hay dos partes a la pregunta:

  1. ¿cómo puede recuperar el certificado
  2. 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.

+0

Eso suena muy prometedor - ¡Gracias! – KenD

+0

[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

+0

@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. –

2

Con el fin de crear la misma funcionalidad que s_client, debe probablemente tomar un vistazo al código de s_client.

puede encontrar s_client dentro del openssl-XYZtar.gz/aplicaciones/s_client.c

Probablemente PEM_write_bio_X509 hace la "impresión" de X509Certificate:

if (c_showcerts) 
    PEM_write_bio_X509(bio,sk_X509_value(sk,i)); 
} 

Pero existe también la pieza de conexión ...

ftp://ftp.openssl.org/source/openssl-1.0.1.tar.gz

+0

Esperaba que hubiera alguna manera "fácil" de hacerlo usando OpenSSL.neto, pero parece que no :( – KenD

1

para obtener una CRL, compruebe primero el certificado y su certificado de emisión para un cRLDistribu Extensión de tionPoints que contiene un URI GeneralName. Esta extensión se define en RFC 3280 y especifica una forma para que las CA comuniquen la ubicación de la CRL que corresponde al certificado utilizado para emitir otro certificado. Desafortunadamente, esta extensión se define como opcional, y la mayoría de las CA raíz no la usan.

+0

No estoy seguro de cómo se relaciona esto con mi pregunta original? No estoy interesado en CRL, es el certificado "en bruto" que me gustaría tomar ... – KenD

Cuestiones relacionadas