2013-03-11 9 views
7

Sto cercando di ottenere i dati da qualsiasi certificato di nomi di dominio SSL. Ad esempio, desidero inserire qualsiasi indirizzo del sito web, ad es. "http://stackoverflow.com" e il mio codice controllerebbe innanzitutto se esiste un certificato SSL. Se lo fa, voglio che estragga la data di scadenza del certificato. [sto leggendo Domainnames dal DB] Esempio: http://www.digicert.com/help/ottenere informazioni sul certificato ssl - .net

ho bisogno di creare un servizio web per controllare la data di scadenza. come posso implementarlo ?? - Ho cercato un sacco di cose diverse come RequestCertificateValidationCallback e ClientCertificates ecc. Dal momento che sono nuovo a questo, non sono sicuro di ciò che deve essere fatto.

Potrei sbagliare completamente (quindi perché ho bisogno di aiuto) ma dovrei creare un HTTPWebRequest e quindi richiedere in qualche modo il certificato client e gli elementi specifici in questo modo?

Ho provato l'esempio fornito con il certificato @SSL pre-fetch .NET, ma mi viene visualizzato un errore 403.

Qualsiasi aiuto sarebbe molto apprezzato - Grazie.

Questo è il codice che ho scritto che lancia 403 errore proibito.

 Uri u = new Uri("http://services.efi.com/"); 
     ServicePoint sp = ServicePointManager.FindServicePoint(u); 

     string groupName = Guid.NewGuid().ToString(); 
     HttpWebRequest req = HttpWebRequest.Create(u) as HttpWebRequest; 
     req.Accept = "*/*"; 
     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(); 

     string str = expiryDate; 

risposta

1

Hai trovato uno stato di "403 Forbidden", perché questo è ciò che il server restituisce quando si accede quella pagina. Vedo la stessa cosa quando sfoglio quell'Uri usando IE. Questo stato indica che non hai il permesso di accedere all'URL, quindi forse dovresti provare il tuo codice su una pagina a cui hai accesso.

Inoltre, è improbabile che si veda un certificato su una connessione http - si potrebbe invece provare a https.

+0

ho provato a utilizzare https://services.efi.com/, ma ancora sta generando un errore 403. quando ho usato "http://ipp.efi.com" ha funzionato perfettamente. – user166013

+0

Sì, perché l'ultimo Url è accessibile pubblicamente (e anche reindirizza automaticamente a 'https'), e il primo non lo è. Se non riesci a sfogliarlo in IE, non puoi caricarlo neanche dal codice. Semplicemente non puoi accedere a 'services.efi.com' (a meno che tu non abbia credenziali o mezzi di accesso che noi non facciamo!). Forse hai bisogno di una pagina specifica Uri piuttosto che solo un nome di dominio per questo dominio ... –

+0

oh ok, grazie per la tua risposta :) .. sotto il mio dominio (ad esempio services.efi.com) ci sono il numero di siti web ospitati.my requiremnet determina la data di scadenza SSL e intraprende le azioni necessarie (ad esempio invia posta, se la data di scadenza è compresa tra circa 20 giorni). quindi, come posso farlo per ottenere le informazioni sul certificato SSL del mio dominio? – user166013

5

Questo funziona bene:

namespace ConsoleApplication1 
{ 
    using System; 
    using System.Net; 
    using System.Net.Security; 
    using System.Security.Cryptography.X509Certificates; 

    class Program 
    { 
    static void Main() 
    { 
     ServicePointManager.ServerCertificateValidationCallback += ServerCertificateValidationCallback; 

     var request = WebRequest.Create("https://www.google.com"); 

     var response = request.GetResponse(); 

     Console.WriteLine("Done."); 
     Console.ReadLine(); 

    } 

    private static bool ServerCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
    { 
     Console.WriteLine("Certificate expires on " + certificate.GetExpirationDateString()); 

     return true; 
    } 
    } 
} 
+0

quando ho provato ad utilizzare il mio nome di dominio cioè https://webapps.efi.internal/ sta lanciando 403 errore proibito. In realtà, webapps è il nome del server nel mio caso in base al quale ci sono il numero di siti web ospitati. – user166013

1

Se è necessario scaricare il certificato:

  //Do webrequest to get info on secure site 
     var certName = "FileName"; 
     var url = "https://mail.google.com"; 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     response.Close(); 

     //retrieve the ssl cert and assign it to an X509Certificate object 
     X509Certificate cert = request.ServicePoint.Certificate; 

     //convert the X509Certificate to an X509Certificate2 object by passing it into the constructor 
     X509Certificate2 cert2 = new X509Certificate2(cert); 

     string cn = cert2.GetIssuerName(); 
     string cedate = cert2.GetExpirationDateString(); 
     string cpub = cert2.GetPublicKeyString(); 

     var path = Directory.GetCurrentDirectory() + string.Concat("\\", certName, ".der"); 
     byte[] certData = cert2.Export(X509ContentType.Cert); 
     File.WriteAllBytes(path, certData); 

     Console.WriteLine("cert2.GetIssuerName :{0}", cert2.GetIssuerName()); 
     Console.WriteLine("cert2.GetExpirationDateString :{0}", cert2.GetExpirationDateString()); 
     Console.WriteLine("cert2.GetPublicKeyString :{0}", cert2.GetPublicKeyString()); 

.cs file di esempio: https://gist.github.com/thedom85/6db200104c075310527aaef63b172253

Consiglio anche questo sito: https://www.simple-talk.com/dotnet/.net-framework/tlsssl-and-.net-framework-4.0/