2010-03-24 5 views
12

J'écris un utilitaire qui me permettrait de surveiller la santé de nos sites Web. Cela consiste en une série de tâches de validation que je peux exécuter sur une application Web. L'un des tests consiste à anticiper l'expiration d'un certificat SSL particulier.Certificat SSL pré-récupération .NET

Je cherche un moyen de pré-récupérer le certificat SSL installé sur un site web en utilisant .NET ou un WINAPI afin de pouvoir valider la date d'expiration du certificat associé à un site web particulier. Une façon de le faire est de mettre en cache les certificats lorsqu'ils sont validés dans le gestionnaire ServicePointManager.ServerCertificateValidationCallback, puis de les faire correspondre avec les sites Web configurés, mais cela semble un peu hackish. Un autre serait de configurer l'application avec le certificat pour le site Web, mais je préfère éviter cela si je peux afin de minimiser la configuration.

Quel serait le moyen le plus simple pour moi de télécharger un certificat SSL associé à un site Web utilisant .NET afin que je puisse inspecter les informations contenues dans le certificat pour le valider?

EDIT:

Pour étendre la réponse ci-dessous, il n'y a pas besoin de créer manuellement le ServicePoint avant de créer la demande. Il est généré sur l'objet de requête dans le cadre de l'exécution de la requête.

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

question impressionnante :) –

Répondre

17

Je viens d'essayer ceci, qui "fonctionne sur ma machine (tm)".

Renvoie la chaîne de texte représentant la date d'expiration sur le certificat du serveur et requiert un succès réel sur le site 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; 
} 

Je crains que je ne connais pas tous les tenants et les aboutissants de l'utilisation ServicePoint, et tout autre cerceaux que vous pourriez avoir besoin de sauter à travers, mais vous ne recevez pas une date d'expiration SSL pour le site Web réelle tu veux savoir.

EDIT: Assurez-vous que le paramètre "url" utilise le protocole https: //.

par exemple. chaîne contosoExpiry = GetSSLExpiryData ("https://www.contoso.com/");

+0

Nice man - fonctionne parfaitement. Merci!!! –

+0

Je l'ai utilisé pour écrire les détails du certificat lorsque je rencontre des exceptions. Fonctionne très bien. – GregB

+0

Quand j'ai lu ceci, ma question principale était «Qu'est-ce que c'est que cette chose ServicePoint? Il semble que ce soit un objet 'connection helper' pour se connecter à un site particulier, http ou https, et partage les informations nécessaires pour les connexions répétées à ce site, comme, dans ce cas, le certificat. Pratique. –