2010-06-23 36 views
7

Al realizar una solicitud HTTPS al servidor web remoto, uso WebRequest, que establece una conexión segura con el servidor web remoto. Durante el desarrollo, utilizo el certificado autofirmado en el servidor, y WebRequest no puede establecer una conexión segura, ya que cert no es válido, que es el comportamiento esperado.Verificar el certificado SSL remoto durante la solicitud HTTPS

He encontrado este código que comprueba el "control remoto", activado llamando al método SetCertificatePolicy() en el código siguiente.

public static void SetCertificatePolicy() 
{ 
    ServicePointManager.ServerCertificateValidationCallback 
       += RemoteCertificateValidate; 
} 

/// <summary> 
/// Remotes the certificate validate. 
/// </summary> 
private static bool RemoteCertificateValidate(
    object sender, X509Certificate cert, 
    X509Chain chain, SslPolicyErrors error) 
{ 
    // trust any certificate!!! 
    System.Console.WriteLine("Warning, trust any certificate"); 
    return true; 
} 

Me pregunto, si es posible hacer controles especiales sobre certificado SSL a distancia (usando el código anterior, por ejemplo), de modo que pueda verificar que el servidor web remoto utiliza certificado SSL válido, y no cualquier certificado válido, pero exactamente el que quiero? Por ejemplo, quiero asegurarme de estar hablando con el sitio web www.someplace.com, cert emitido por ACME Inc, con huella digital 00:11:22: .....

¿Qué es una "mejor práctica"? "enfoque para este escenario?

Gracias!

Respuesta

7

Si realmente desea clavarlo en un certificado en particular, puede comparar los datos del certificado (en formato DER) con el byte[] en certificate.GetRawCertData().

También puede utilizar GetCertHashString() y Subject en el parámetro certificate en RemoteCertificateValidate para obtener la información que está buscando. El nombre de host debe estar en el nombre alternativo del sujeto del certificado o, si no hay un nombre alternativo de sujeto, en el CN ​​del nombre del sujeto (distinguido). Teniendo en cuenta la forma en que .NET formatea la cadena de asunto, este debería ser el primer CN = que encuentre allí.

También obtendrá más datos si certificate es una instancia de X509Certificate2. Luego podrá obtener SubjectName como X500PrincipalName y también Extensions (para verificar la extensión del nombre alternativo del sujeto). Puede ser útil utilizar herramientas como BouncyCastle para analizar el nombre del sujeto.

También es probable que obtenga más información sobre el nombre de host que está tratando de contactar en el sender, dependiendo de su tipo de tiempo de ejecución.

+0

Gracias, esa era la información que buscaba. Solo una Q rápida, sobre la primera pista (comparando los datos de cert con el byte []) - ¿necesito comparar la matriz de bytes de certificados válida conocida con la que estoy verificando? –

+0

Creo que la matriz de bytes va a ser el certificado en codificación DER, por lo que probablemente debería comparar eso con su certificado de referencia en formato DER (muchas herramientas, incluida la herramienta de certificado de Windows pueden exportar a ese formato). Incluso es posible que pueda cargar esto directamente desde el almacén de certificados (no estoy seguro de cómo). – Bruno

Cuestiones relacionadas