2010-03-24 14 views
12

Estoy escribiendo una utilidad que me permitiría controlar el estado de nuestros sitios web. Esto consiste en una serie de tareas de validación que puedo ejecutar contra una aplicación web. Una de las pruebas es anticipar el vencimiento de un certificado SSL particular.Pre-fetch de certificado SSL .NET

Estoy buscando una forma de buscar previamente el certificado SSL instalado en un sitio web usando .NET o WINAPI para que pueda validar la fecha de vencimiento del certificado asociado a un sitio web en particular.

Una forma de hacerlo es almacenar en caché los certificados cuando se validan en el controlador ServicePointManager.ServerCertificateValidationCallback y luego hacerlos coincidir con los sitios web configurados, pero esto parece un poco hackish. Otra sería configurar la aplicación con el certificado para el sitio web, pero prefiero evitar esto si puedo para minimizar la configuración.

¿Cuál sería la forma más fácil para mí de descargar un certificado SSL asociado a un sitio web usando .NET para poder inspeccionar la información que contiene el certificado para validarlo?

EDIT:

Extender sobre la respuesta de abajo no hay necesidad de crear manualmente el ServicePoint antes de crear la solicitud. Se genera en el objeto de solicitud como parte de la ejecución de la solicitud.

private static string GetSSLExpiration(string url) 
    { 
     HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 
     using (WebResponse response = request.GetResponse()) { } 
     if (request.ServicePoint.Certificate != null) 
     { 
      return request.ServicePoint.Certificate.GetExpirationDateString(); 
     } 
     else 
     { 
      return string.Empty; 
     } 
    } 
+4

pregunta asombrosa :) –

Respuesta

17

Acabo de probar esto, que "funciona en mi máquina (tm)".

Devuelve la cadena de texto que representa la fecha de caducidad en el certificado del servidor y requiere que se realice un acierto real en el sitio web.

private string GetSSLExpiryDate(string url) 
{ 
    Uri u = new Uri(url); 
    ServicePoint sp = ServicePointManager.FindServicePoint(u); 

    string groupName = Guid.NewGuid().ToString(); 
    HttpWebRequest req = HttpWebRequest.Create(u) as HttpWebRequest; 
    req.ConnectionGroupName = groupName; 

    using (WebResponse resp = req.GetResponse()) 
    { 
     // Ignore response, and close the response. 
    } 
    sp.CloseConnectionGroup(groupName); 

    // Implement favourite null check pattern here on sp.Certificate 
    string expiryDate = sp.Certificate.GetExpirationDateString(); 

    return expiryDate; 
} 

Me temo que no conozco todos los aciertos y errores de la utilización de ServicePoint, y cualquier otro aros que pueda necesitar para saltar a través, pero se obtiene una fecha de caducidad SSL para el sitio web real quieres saber sobre.

EDIT: asegúrese de que el parámetro "url" utilice el protocolo https: //.

p. Ej. string contosoExpiry = GetSSLExpiryData ("https://www.contoso.com/");

+0

Buen hombre - funciona perfecto. ¡¡¡Gracias!!! –

+0

Lo usé para escribir detalles del certificado cuando presiono excepciones. Funciona genial. – GregB

+0

Cuando leí esto, mi pregunta principal fue '¿qué es esto de ServicePoint?' Parece que es un objeto de "ayudante de conexión" para conectarse a un sitio en particular, http o https, y comparte información necesaria para conexiones repetidas a ese sitio, como, en este caso, el certificado. Práctico. –

Cuestiones relacionadas