2010-03-24 48 views
12

Tôi đang viết một tiện ích cho phép tôi theo dõi tình trạng của trang web của chúng tôi. Điều này bao gồm một loạt các nhiệm vụ xác thực mà tôi có thể chạy với ứng dụng web. Một trong các bài kiểm tra là dự đoán hết hạn của một chứng chỉ SSL cụ thể.Tìm nạp trước chứng chỉ SSL .NET

Tôi đang tìm cách tìm nạp trước chứng chỉ SSL được cài đặt trên trang web bằng .NET hoặc WINAPI để tôi có thể xác thực ngày hết hạn của chứng chỉ được liên kết với một trang web cụ thể. Một trong những cách tôi có thể làm điều này là để lưu trữ các chứng chỉ khi chúng được xác nhận trong trình xử lý ServicePointManager.ServerCertificateValidationCallback và sau đó kết hợp chúng với các trang web đã được cấu hình, nhưng điều này có vẻ hơi bị hack một chút. Khác sẽ được cấu hình các ứng dụng với giấy chứng nhận cho trang web, nhưng tôi muốn tránh điều này nếu tôi có thể để giảm thiểu cấu hình.

Cách nào dễ nhất để tôi tải xuống chứng chỉ SSL được liên kết với trang web bằng .NET để tôi có thể kiểm tra thông tin chứng chỉ chứa để xác thực?

EDIT:

Để mở rộng trên câu trả lời dưới đây không cần phải tự tạo ra các ServicePoint trước khi tạo yêu cầu. Nó được tạo ra trên đối tượng yêu cầu như là một phần của việc thực hiện yêu cầu.

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

câu hỏi tuyệt vời :) –

Trả lời

17

Tôi vừa thử tính năng này "hoạt động trên máy của tôi (tm)".

Nó trả về chuỗi văn bản biểu thị ngày hết hạn trên chứng chỉ của máy chủ và yêu cầu phải thực hiện lần truy cập thực tế trên trang web.

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

Tôi sợ rằng tôi không biết tất cả các quyền và những sai lầm của việc sử dụng ServicePoint, và bất kỳ hoops khác mà bạn có thể cần phải nhảy qua, nhưng bạn nhận được một SSL ngày hết hạn cho trang web thực tế bạn muốn biết.

EDIT: đảm bảo thông số "url" sử dụng giao thức https: //.

ví dụ: string contosoExpiry = GetSSLExpiryData ("https://www.contoso.com/");

+0

Người đàn ông đẹp - hoạt động hoàn hảo. Cảm ơn!!! –

+0

Tôi đã sử dụng tính năng này để viết chi tiết chứng chỉ khi tôi nhấn ngoại lệ. Hoạt động tuyệt vời. – GregB

+0

Khi tôi đọc câu hỏi chính của tôi là 'điều ServicePoint này là gì?' Dường như nó là đối tượng trợ giúp kết nối để kết nối với một trang web cụ thể, http hoặc https và chia sẻ thông tin cần thiết cho các kết nối lặp lại đến trang web đó, như trong trường hợp này là chứng chỉ. Tiện dụng. –

Các vấn đề liên quan