2013-03-11 16 views
7

Szukam danych z dowolnych nazw domen certyfikatu SSL. Na przykład chcę wprowadzić dowolny adres witryny, np. "http://stackoverflow.com", a mój kod najpierw sprawdzi, czy istnieje certyfikat SSL. Jeśli tak, chcę, aby wyciągnęła datę wygaśnięcia certyfikatu. [Czytam nazwy domen z DB] Przykład: http://www.digicert.com/help/uzyskać informacje o certyfikacie ssl - .net

Potrzebuję stworzyć serwis internetowy, aby sprawdzić datę wygaśnięcia. jak mogę to zaimplementować? - Sprawdziłem wiele różnych rzeczy, takich jak RequestCertificateValidationCallback i ClientCertificates itp. Ponieważ jestem nowy w tym, nie jestem pewien, co należy zrobić.

Mogę być całkowicie błędny (stąd dlaczego potrzebuję pomocy), ale czy utworzę HTTPWebRequest, a następnie jakoś zażądam certyfikatu klienta i określonych elementów w ten sposób?

Próbowałem przykład pod warunkiem, że @SSL wstępnego pobierania certyfikatu .NET, ale otrzymuję błąd 403 forbitten.

Każda pomoc zostanie doceniona - dziękuję.

To jest kod, który napisałem, który rzuca 403 niedozwolony błąd.

 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; 

Odpowiedz

1

otrzymujesz status „403 zakazanych”, ponieważ to właśnie powraca serwera podczas uzyskiwania dostępu do tej strony. Widzę to samo, gdy przeglądam ten Uri używając IE. Ten status oznacza, że ​​nie masz uprawnień dostępu do adresu URL, więc może powinieneś wypróbować swój kod na stronie, do której masz dostęp.

Poza tym prawdopodobnie nie zobaczysz certyfikatu na połączeniu http - możesz zamiast tego wypróbować https.

+0

Próbowałem za pomocą https://services.efi.com/, ale nadal jest rzucanie błąd 403. kiedy użyłem "http://ipp.efi.com" działało idealnie. – user166013

+0

Tak, ponieważ ten ostatni adres URL jest publicznie dostępny (a także automatycznie przekierowuje do 'https'), a pierwszy nie. Jeśli nie możesz przejść do niego w IE, nie możesz załadować go również z kodu. Po prostu nie możesz uzyskać dostępu do strony "services.efi.com" (chyba że masz poświadczenia lub dostęp, którego nie mamy!). Być może potrzebujesz konkretnej strony Uri, a nie tylko nazwę domeny dla tej domeny ... –

+0

o ok, dziękuję za odpowiedź :) .. pod moją domeną (powiedzmy services.efi.com) istnieje wiele witryn hosted.my requiremnet określa datę wygaśnięcia SSL i podejmuje niezbędne działania (np. wyślij wiadomość e-mail, jeśli data ważności to około 20 dni). więc jak mogę to zrobić, aby uzyskać informacje o certyfikacie SSL mojej domeny? – user166013

5

Działa to dobrze:

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

Kiedy próbowałem używając mojego nazwę domeny czyli https://webapps.efi.internal/ rzuca 403 niedozwolony błąd. W rzeczywistości, webapps to nazwa serwera w moim przypadku, pod którym znajduje się wiele hostowanych witryn. – user166013

1

Jeśli trzeba pobrać certyfikat:

  //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 Przykładowy plik: https://gist.github.com/thedom85/6db200104c075310527aaef63b172253

Ja również polecam tę stronę: https://www.simple-talk.com/dotnet/.net-framework/tlsssl-and-.net-framework-4.0/

Powiązane problemy