2009-05-15 23 views
7

Sto provando a leggere un certificato X509 utilizzando Request.ClientCertificate ma non viene restituito nulla. Il certificato è stato definitivamente allegato alla richiesta perché posso ottenere le informazioni sul certificato dalla pagina che invia la richiesta.leggere il certificato client da httprequest C#

Ho provato a leggere il certificato da diversi posti ma non riesco a farlo funzionare.

Ho iniziato con il codice da this KB Article. Nella pagina richiesta ho provato a stampare alcune informazioni sul certificato ma non è stato restituito nulla nella risposta.

Questo è in esecuzione su IIS 5.1 e la comunicazione è su SSL. Questo deve essere fatto utilizzando la versione 2 del framework .Net

Perché il certificato sembra scomparire?

+0

Non l'ho visto prima di chiedere essenzialmente la stessa domanda solo pochi minuti fa. È un po 'scoraggiante che non hai ancora una risposta ... – DaveN59

+1

A che punto del ciclo di vita stai tentando di recuperarlo? Pagina OnInit, OnLoad, Pagina master, Global.asax, ecc.? – CodeRot

+0

Provo a recuperarlo nel metodo Page_Load – Sean

risposta

1

Ok, non è completamente chiaro ma si dispone di un sito Web che richiede ai client di autenticarsi utilizzando i certificati? Perché questo è ciò che la proprietà Request.ClientCertificate è per.

Dico questo perché c'è qualcosa di strano nella tua domanda.

"Posso ottenere le informazioni sul certificato dalla pagina che invia la richiesta."

In genere le pagine non inviano richieste ai client.

Per ottenere il certificato del server è possibile aprire X509Store e setacciare i certificati per trovare quello con il CN necessario.

+0

"la pagina che invia la richiesta" è il client in questo caso. Allega un certificato X509 alla richiesta per la pagina che tento di utilizzare la proprietà Request.ClientCertificate in – Sean

2

Non sono sicuro di cosa sia necessario per il certificato client, ma se lo si utilizza per l'autenticazione o l'autorizzazione personalizzata, è consigliabile considerare l'utilizzo dell'infrastruttura di sicurezza del server Web anziché implementare la propria. Ad esempio, è possibile configurare IIS per richiedere certificati client, associare i certificati agli account utente e utilizzare l'autenticazione basata su Windows. Ovviamente, questo non funziona necessariamente per il tuo dominio problematico.

11

Ho scritto una pagina Web di identificazione un po 'indietro che cercava un certificato client e se trovato mostrava le informazioni del certificato. Credo che sia quello che stai cercando ... Ecco la pagina:

<%@ 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

Come è la risposta migliore? L'OP ha detto che sta già usando 'Page.Request.ClientCertificate.Certificate' ma sta restituendo' null'. Questo non fa nulla per aiutare a risolvere il problema. – jtate

Problemi correlati