2013-03-11 6 views
7

나는 주어진 도메인 이름 SSL 인증서에서 데이터를 얻으려고합니다. 예를 들어 나는 어떤 웹 사이트 주소에 넣고 싶습니다. "http://stackoverflow.com"그리고 내 코드는 먼저 SSL 인증서가 있는지 확인합니다. 그럴 경우 인증서의 만료일을 철회하고 싶습니다. [DB에서 도메인 이름을 읽는 중] 예 : http://www.digicert.com/help/SSL 인증서 정보 얻기 - .net

만료일을 확인하려면 웹 서비스를 만들어야합니다. 어떻게 구현할 수 있습니까 ?? - 나는 RequestCertificateValidationCallback 및 ClientCertificates 등등과 같은 다른 것들을 훑어 보았다. 나는 이것에 대해 새로운 것이므로 무엇을해야하는지 확신 할 수 없다.

제가 완전히 틀릴 수 있습니다 (따라서 왜 도움이 필요합니까?)하지만 HTTPWebRequest를 작성한 다음 어떻게 든 클라이언트 인증서와 특정 요소를 요청하게됩니까?

@SSL 인증서 프리 페치 .NET 예제를 시도했지만 forbitten 403 오류가 발생했습니다.

도움을 주시면 감사하겠습니다. - 감사합니다.

이것은 403 금지 된 오류를 던지고있는 코드입니다.

 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; 

답변

1

. IE를 사용하여 Uri를 탐색 할 때도 똑같은 것을 볼 수 있습니다. 이 상태는 사용자가 URL에 액세스 할 수있는 권한이 없음을 나타내므로 액세스 권한이있는 페이지에서 코드를 시도해야합니다.

또한 http 연결에서 인증서를 볼 수 없습니다. 대신 https을 사용해보세요.

+0

https://services.efi.com/을 사용해 보았지만 여전히 403 오류가 발생합니다. 내가 'http://ipp.efi.com'을 사용했을 때 완벽하게 작동했습니다. – user166013

+0

예, 후자의 URL이 공개적으로 액세스 할 수 있고 (자동으로 'https'로 리디렉션되기 때문에) 전자는 그렇지 않습니다. IE에서 탐색 할 수 없으면 코드에서도로드 할 수 없습니다. 'services.efi.com'에 액세스 할 수 없습니다 (자격 증명이나 액세스 수단이없는 경우 제외). 아마도이 도메인에 대한 도메인 이름보다는 특정 페이지 Uri가 필요합니다 ... –

+0

오, 답장을 보내 주셔서 감사합니다 :) .. 내 도메인 아래에 (services.efi.com) 호스팅 웹 사이트 수가 많습니다. requiremnet은 SSL 만료 날짜를 결정하고 필요한 조치를 취하는 것입니다 (만료 날짜가 약 20 일이 지나면 메일 보내기). 그렇다면 내 도메인의 SSL 인증서 정보를 얻으려면 어떻게해야합니까? – user166013

5

이 잘 작동합니다 : 즉 서버가 반환하면 해당 페이지에 액세스 할 때 무엇 때문에 당신은 "403 금지"상태를 받고

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

을 즉, HTTPS ://webapps.efi.internal/ 403 금지 된 오류가 발생합니다. 사실, webapps 내 웹 사이트의 수가 호스팅되는 서버의 이름입니다. – user166013

1

인증서를 다운로드해야하는 경우 :

  //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을 샘플 파일 : 나는 또한이 사이트 추천 https://gist.github.com/thedom85/6db200104c075310527aaef63b172253

: 내 도메인 이름을 사용하려고 할 때 https://www.simple-talk.com/dotnet/.net-framework/tlsssl-and-.net-framework-4.0/