2009-05-15 2 views
7

Tôi đang cố gắng đọc chứng chỉ X509 bằng cách sử dụng Request.ClientCertificate nhưng không có gì được trả lại. Chứng chỉ chắc chắn được đính kèm theo yêu cầu vì tôi có thể lấy thông tin chứng chỉ từ trang gửi yêu cầu.đọc chứng chỉ ứng dụng khách từ httprequest C#

Tôi đã thử đọc chứng chỉ từ nhiều nơi khác nhau nhưng dường như không làm cho nó hoạt động.

Tôi bắt đầu bằng mã từ this KB Article. Trong trang được yêu cầu, tôi đã cố gắng in ra một số thông tin về chứng chỉ nhưng không có gì được trả về trong phản hồi.

Điều này đang chạy trên IIS 5.1 và giao tiếp qua SSL. Điều này phải được thực hiện bằng cách sử dụng phiên bản 2 của .Net framework

Tại sao chứng chỉ dường như biến mất?

+0

Tôi không thấy điều này trước khi hỏi về cơ bản cùng một câu hỏi chỉ vài phút trước. Rất tiếc, bạn chưa có câu trả lời ... – DaveN59

+1

Điểm nào trong vòng đời bạn đang cố truy xuất nó? Trang OnInit, OnLoad, Master Page, Global.asax, vv? – CodeRot

+0

Tôi cố gắng truy xuất nó trong phương thức Page_Load – Sean

Trả lời

1

Ok nó không hoàn toàn rõ ràng nhưng bạn có một trang web yêu cầu khách hàng tự xác thực bằng chứng chỉ? Vì đó là thuộc tính của Request.ClientCertificate.

Tôi nói điều này bởi vì có điều gì đó kỳ lạ về câu hỏi của bạn.

"Tôi có thể lấy thông tin chứng chỉ từ trang gửi yêu cầu".

Trang nói chung không thực sự gửi yêu cầu mà khách hàng thực hiện.

Để nhận chứng chỉ máy chủ, bạn có thể mở X509Store và chọn lọc thông qua các chứng chỉ để tìm một thiết bị có CN mà bạn cần.

+0

"trang gửi yêu cầu" là ứng dụng khách trong trường hợp này. Nó đính kèm chứng chỉ X509 vào yêu cầu cho trang mà tôi cố gắng sử dụng thuộc tính Request.ClientCertificate trong – Sean

2

Tôi không chắc bạn cần chứng chỉ ứng dụng khách hàng nào, nhưng nếu bạn đang sử dụng nó để xác thực hoặc ủy quyền tùy chỉnh của riêng mình, bạn có thể cân nhắc sử dụng cơ sở hạ tầng bảo mật của máy chủ web thay vì thực hiện. Ví dụ, bạn có thể cấu hình IIS để yêu cầu chứng chỉ ứng dụng khách, ánh xạ các chứng chỉ tới các tài khoản người dùng và sử dụng xác thực dựa trên Windows. Tất nhiên, điều này không nhất thiết phải làm việc cho miền vấn đề của bạn.

11

Tôi đã viết một trang web nhận dạng trong khi đó lại tìm kiếm chứng chỉ ứng dụng khách và nếu được tìm thấy sẽ hiển thị thông tin chứng chỉ. Tôi tin rằng đó là những gì bạn đang tìm kiếm ... Đây là trang:

<%@ Page Language="C#" Trace="false" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> 
<%@ Import Namespace="System.Security.Cryptography" %> 

<script runat="server"> 
    //protected void Page_Load(object sender, EventArgs e) 
    //{ } 

    void LoadCertInfo() 
    { 
     string para = "<div style='margin: 10px 0 0 0; font-weight: bold'>{0}</div>"; 
     string subpara = "<div style='margin-left: 15px; font-size: 90%'>{0}</div>"; 

     if (Page.Request.ClientCertificate.IsPresent) 
     { 
      Response.Write("<hr /><div style='width: 500px; margin: 20px auto'>"); 
      Response.Write("<h3 style='width: 500px; margin: 20px auto'>Client Certificate Information</h3>"); 
      try 
      { 
       X509Certificate2 x509Cert2 = new X509Certificate2(Page.Request.ClientCertificate.Certificate); 

       Response.Write(string.Format(para, "Issued To:")); 
       Response.Write(string.Format(subpara, x509Cert2.Subject)); 

       Response.Write(string.Format(para, "Issued By:")); 
       Response.Write(string.Format(subpara, x509Cert2.Issuer)); 

       Response.Write(string.Format(para, "Friendly Name:")); 
       Response.Write(string.Format(subpara, string.IsNullOrEmpty(x509Cert2.FriendlyName) ? "(None Specified)" : x509Cert2.FriendlyName)); 

       Response.Write(string.Format(para, "Valid Dates:")); 
       Response.Write(string.Format(subpara, "From: " + x509Cert2.GetEffectiveDateString())); 
       Response.Write(string.Format(subpara, "To: " + x509Cert2.GetExpirationDateString())); 

       Response.Write(string.Format(para, "Thumbprint:")); 
       Response.Write(string.Format(subpara, x509Cert2.Thumbprint)); 

       //Response.Write(string.Format(para, "Public Key:")); 
       //Response.Write(string.Format(subpara, x509Cert2.GetPublicKeyString())); 

       #region EKU Section - Retrieve EKU info and write out each OID 
       X509EnhancedKeyUsageExtension ekuExtension = (X509EnhancedKeyUsageExtension)x509Cert2.Extensions["Enhanced Key Usage"]; 
       if (ekuExtension != null) 
       { 
        Response.Write(string.Format(para, "Enhanced Key Usages (" + ekuExtension.EnhancedKeyUsages.Count.ToString() + " found)")); 

        OidCollection ekuOids = ekuExtension.EnhancedKeyUsages; 
        foreach (Oid ekuOid in ekuOids) 
         Response.Write(string.Format(subpara, ekuOid.FriendlyName + " (OID: " + ekuOid.Value + ")")); 
       } 
       else 
       { 
        Response.Write(string.Format(para, "No EKU Section Data")); 
       } 
       #endregion // EKU Section 

       #region Subject Alternative Name Section 
       X509Extension sanExtension = (X509Extension)x509Cert2.Extensions["Subject Alternative Name"]; 
       if (sanExtension != null) 
       { 
        Response.Write(string.Format(para, "Subject Alternative Name:")); 
        Response.Write(string.Format(subpara, sanExtension.Format(true))); 
       } 
       else 
       { 
        Response.Write(string.Format(para, "No Subject Alternative Name Data")); 
       } 

       #endregion // Subject Alternative Name Section 

       #region Certificate Policies Section 
       X509Extension policyExtension = (X509Extension)x509Cert2.Extensions["Certificate Policies"]; 
       if (policyExtension != null) 
         { 
          Response.Write(string.Format(para, "Certificate Policies:")); 
          Response.Write(string.Format(subpara, policyExtension.Format(true))); 
         } 
         else 
         { 
          Response.Write(string.Format(para, "No Certificate Policies Data")); 
         } 
       #endregion //Certificate Policies Section 


       // Example on how to enumerate all extensions 
       //foreach (X509Extension extension in x509Cert2.Extensions) 
       // Response.Write(string.Format(para, extension.Oid.FriendlyName + "(" + extension.Oid.Value + ")")); 
      } 
      catch (Exception ex) 
      { 
       Response.Write(string.Format(para, "An error occured:")); 
       Response.Write(string.Format(subpara, ex.Message)); 
       Response.Write(string.Format(subpara, ex.StackTrace)); 
      } 
      finally 
      { 
       Response.Write("</div>"); 
      } 
     } 
    } 
</script> 
<html> 
    <head runat="server"> 
    <title><% Page.Response.Write(System.Environment.MachineName); %></title> 
    </head> 
    <body> 
     <% LoadCertInfo(); %> 
    </body> 
</html> 
+0

Câu trả lời hàng đầu này như thế nào? OP cho biết anh ta đã sử dụng 'Page.Request.ClientCertificate.Certificate' nhưng nó trả về' null'. Điều này không có gì để giúp giải quyết vấn đề. – jtate