2013-03-28 7 views
6

Muszę opracować aplikację w języku C#, aby uzyskać informacje o certyfikacie SSL, takie jak data wygaśnięcia, wydana przez itp. W oparciu o DNS (powiedz * .google.com) więc jeśli zbliżymy się do daty wygaśnięcia, będę mógł z niej skorzystać. Jeśli udostępnię DNS jako * .google.com, muszę uzyskać szczegółowe informacje o certyfikacie SSL tej domeny.jak uzyskać informacje o certyfikacie SSL zdalnego serwera w języku C#

Próbowałem następujące http://awesomeideas.net/page/Cert-Expiry-Check.aspx, ale czuję, że jest to dla certyfikatów przechowywanych w systemie lokalnym. Próbowałem również używać HttpWebRequest do uzyskania szczegółów certyfikatu SSL, ale wymagało to wprowadzenia poprawnego identyfikatora URI, który w moim przypadku nie jest dostępny. Mam tylko nazwę DNS

poniżej jest kod, którego użyłem do uzyskania informacji za pomocą HttpWebRequest. ale wymagane mi podać poprawną URI typu https: //*.domain.com

Uri uri = new Uri(DNSEntry); 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
request.Method = WebRequestMethods.Http.Get; 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
X509Certificate cert1 = request.ServicePoint.Certificate; 
X509Certificate2 cert = new X509Certificate2(cert1); 
DateTime dtCertExpiry = Convert.ToDateTime(cert.NotAfter.ToString()); 
+0

http://stackoverflow.com/faq#howtoask Proszę zapoznać się z FAQ na temat, jak zadać pytanie – BlackICE

+0

przepraszam za nie delegowania pytanie poprawnie. muszę opracować aplikację w języku C#, aby uzyskać informacje o certyfikacie SSL, takie jak data wygaśnięcia, wydane przez itp. w oparciu o DNS [say * .google.com] i zapewnić, że jeśli data wygaśnięcia zbliża się, mogę proaktywnie sobie z tym poradzić. Jeśli zapewniam DNS jako * .google.com, muszę uzyskać szczegóły informacji o certyfikacie SSL tej domeny. – user166013

+0

Co próbowałeś, aby to osiągnąć? Czy potrzebujesz ogólnego kierunku, czy też masz problemy z czymś, co robisz? – BlackICE

Odpowiedz

8

Próbowałem za pomocą następujących to działa dobrze:

ciąg strDNSEntry jest DNS, dla których potrzebne są SSL

public X509Certificate2 DownloadSslCertificate(string strDNSEntry) 
{ 

    X509Certificate2 cert = null; 
    using (TcpClient client = new TcpClient()) 
    { 
     //ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;   
     client.Connect(strDNSEntry, 443); 

     SslStream ssl = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null); 
     try 
     { 
      ssl.AuthenticateAsClient(strDNSEntry); 
     } 
     catch (AuthenticationException e) 
     { 
      log.Debug(e.Message); 
      ssl.Close(); 
      client.Close(); 
      return cert; 
     } 
     catch (Exception e) 
     { 
      log.Debug(e.Message); 
      ssl.Close(); 
      client.Close(); 
      return cert; 
     } 
     cert = new X509Certificate2(ssl.RemoteCertificate); 
     ssl.Close(); 
     client.Close(); 
     return cert; 
    } 
} 


public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
{ 
    if (sslPolicyErrors == SslPolicyErrors.None) 
     return true; 

    Console.WriteLine("Certificate error: {0}", sslPolicyErrors); 

    // Do not allow this client to communicate with unauthenticated servers. 
    return false; 
} 
Powiązane problemy