2010-03-24 26 views
12

Sto scrivendo un'utilità che mi consenta di monitorare lo stato dei nostri siti Web. Questo consiste in una serie di attività di convalida che posso eseguire su un'applicazione web. Uno dei test consiste nell'anticipare la scadenza di un determinato certificato SSL.Prelettura del certificato SSL .NET

Sto cercando un modo per pre-recuperare il certificato SSL installato su un sito Web utilizzando .NET o WINAPI in modo da poter convalidare la data di scadenza del certificato associato a un sito Web specifico.

Un modo per farlo è memorizzare nella cache i certificati quando vengono convalidati nel gestore ServicePointManager.ServerCertificateValidationCallback e quindi confrontarli con siti Web configurati, ma questo sembra un po 'logico. Un altro sarebbe configurare l'applicazione con il certificato per il sito Web, ma preferirei evitare questo se possibile per minimizzare la configurazione.

Quale sarebbe il modo più semplice per me di scaricare un certificato SSL associato a un sito Web utilizzando .NET in modo da poter esaminare le informazioni contenute nel certificato per convalidarlo?

EDIT:

Per estendere sulla risposta qui sotto non v'è alcuna necessità di creare manualmente la ServicePoint prima di creare la richiesta. Viene generato sull'oggetto richiesta come parte dell'esecuzione della richiesta.

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

domanda stupenda :) –

risposta

17

Ho appena provato questo, che "funziona sulla mia macchina (tm)".

Restituisce la stringa di testo che rappresenta la data di scadenza sul certificato del server e richiede un hit effettivo sul sito 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; 
} 

Temo di non conosco tutti i diritti e torti di usare ServicePoint, e tutti gli altri cerchi che si potrebbe aver bisogno di passare attraverso, ma si ottiene una data di scadenza SSL per il sito web attuale vuoi sapere di

MODIFICA: assicurarsi che il parametro "url" utilizzi il protocollo https: //.

ad es. string contosoExpiry = GetSSLExpiryData ("https://www.contoso.com/");

+0

Bell'uomo - funziona perfettamente. Grazie!!! –

+0

L'ho usato per scrivere i dettagli del certificato quando ho trovato delle eccezioni. Funziona alla grande. – GregB

+0

Quando ho letto questo, la mia domanda principale era "che cosa è questa cosa di ServicePoint?" Sembra che sia un oggetto 'helper di connessione' per la connessione a un sito particolare, http o https e condivide le informazioni necessarie per le connessioni ripetute a quel sito, come, in questo caso, il certificato. Maneggevole. –

Problemi correlati