2010-03-24 3 views
12

저는 웹 사이트의 상태를 모니터링 할 수있는 유틸리티를 작성하고 있습니다. 이것은 웹 응용 프로그램에 대해 실행할 수있는 일련의 유효성 검사 작업으로 구성됩니다. 테스트 중 하나는 특정 SSL 인증서의 만료를 예상하는 것입니다.SSL 인증서 미리 가져 오기 .NET

.NET 또는 WINAPI를 사용하여 웹 사이트에 설치된 SSL 인증서를 미리 가져 와서 특정 웹 사이트와 연결된 인증서의 유효 기간을 확인할 수있는 방법을 찾고 있습니다.

내가 할 수있는 한 가지 방법은 ServicePointManager.ServerCertificateValidationCallback 처리기에서 유효성을 검사하고 구성된 웹 사이트와 일치시킬 때 인증서를 캐싱하는 것입니다. 그러나 이것은 약간 hackish 한 것 같습니다. 또 다른 웹 사이트에 대한 인증서로 응용 프로그램을 구성하는 것입니다,하지만 오히려 내가 구성을 최소화하기 위해 할 수 있다면 이것을 피할 것입니다.

.NET을 사용하는 웹 사이트와 연결된 SSL 인증서를 다운로드하여 인증서에 유효성을 검사하는 데 필요한 정보를 검사 할 수있는 가장 쉬운 방법은 무엇입니까?

편집 : 아래의 요청을 수동으로 작성하기 전에 ServicePoint를 만들 필요가 없습니다

는 답변을 확장 할 수 있습니다. 요청을 실행하는 과정에서 요청 객체에 대해 생성됩니다.

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

awesome question :) –

답변

17

저는 "내 컴퓨터에서 작동합니다"라고 시도했습니다.

서버의 인증서에 만료일을 나타내는 텍스트 문자열을 반환하며 웹 사이트에서 실제로 히트해야합니다.

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; 
} 

는 내가 모든 권리와 ServicePoint을 사용하는 잘못, 당신은을 통해 이동해야 할 수있는 다른 농구를 모르는 두려워 해요,하지만 당신은 실제 웹 사이트에 대한 SSL 유효 기간을받을 수 있나요 너는 알고 싶어한다.

EDIT : "url"매개 변수가 https : // 프로토콜을 사용하는지 확인하십시오.

문자열 contosoExpiry = GetSSLExpiryData ("https://www.contoso.com/");

+0

멋진 남자 - 완벽하게 작동합니다. 감사!!! –

+0

예외가 발생했을 때 인증서 세부 정보를 쓸 때이 방법을 사용했습니다. 훌륭하게 작동합니다. – GregB

+0

이 질문을 읽을 때 '이 ServicePoint는 무엇입니까?' 특정 사이트 (http 또는 https)에 연결하기위한 '연결 도우미'개체이며이 사이트 (예 : 인증서)에 대한 반복 연결에 필요한 정보를 공유하는 것 같습니다. 능숙한. –