27.2.2 ASP/ASP.NET頁面獲取客戶端證書的方法

ASP/ASP.NET頁面上讀取客戶端數字證書有兩中方法,分別是讀取Request.ClientCertificatekey[SubField])和讀取Request.ServerVariblesServer Environment Variable)。

1.讀取Request.ClientCertificate(key[SubField])

ClientCertificate集合是X509標準規定的從Web瀏覽器發佈請求中獲取證書驗證字段。如果Web服務器沒有要求客戶端證書驗證,ClientCertificate集合將返回EMPTY。它的語法如下所示。

Request.ClientCertificate(key[SubField])

參數:Key指定要獲取證書字段的名稱。對於Key,該集合具的關鍵字如下表所示:

.ClientCertificate(key[SubField])支持的key關鍵字和意義

意義

Certificate

ASN.1 格式的二進制流字符串,即完整的證書內容。

Flags

一組標誌,提供其他客戶端證書信息。可以設置下面的標誌:ceCertPresent(當前的客戶端證書)和ceUnrecognizedIssuer(該鏈接上來自未知的發行者的最後一個證書)。

Issuer

包含子字段值的列表的字符串,此列表包含證書頒發者的信息。若該值在無SubField項的情況下指定,則ClientCertificate集合返回一個以逗號分隔的子字段列表。例如:C=US, O=Verisign等。

SerialNumber

包含證書的序列號的字符串,序列號以連字符(-)分隔的16進制ASCII碼錶示,如04-67-F3-02

Subject

包含子字段值的列表的字符串,此列表包含有關證書的主題信息。若該值在無SubField項的情況下指定,則 ClientCertificate 集合返回一個以逗號分隔的子字段列表。例如,C=US, O=Verisign 等。

ValidFrom

指定證書何時有效。此日期遵循VBScript格式並隨國家(地區)設置而變化。例如,在美國可表示爲9/26/96 11:59:59 PM

ValidUntil

指定證書何時到期

SubField爲可選參數,用於按SubjectIssuer關鍵字檢索單獨的字段。此參數作爲一個後綴添加到Key參數中,如IssuerOSubjectCN。下表列出了一些通用的SubField值。

SubField支持的參數和意義

意義

C

指定原國家(地區)名。

CN

指定公用用戶名。(此子字段僅同 Subject 關鍵字一起使用。)

GN

指定給定的名稱

L

指定所在地

O

指定公司或組織名稱

OU

指定機構的名稱

S

指定州或省。

T

指定州或省

2.讀取Request.ServerVaribles(Server Environment Variable)

環境變量的集合,讀取HTTP環境變量。可以通過使用HTTP_前綴來讀取任何頭信息。可以使用下表所示的變量獲得數字證書相關信息。

ServerVaribles支持的參數和意義

意義

CERT_COOKIE

唯一的客戶證書ID

CERT_FLAG

客戶證書標誌,如有客戶端證書,則bit00。如果客戶端證書驗證無效,bit1被設置爲1

CERT_ISSUER

用戶證書中的頒發者字段

CERT_KEYSIZE

安全套接字層(SSL)連接密鑰的位數,如128

CERT_SECRETKEYSIZE

服務器證書私鑰的位數,如1024

CERT_SERIALNUMBER

客戶證書的序列號字段

CERT_SUBJECT

客戶端證書的主題字段

CERT_SERVER_ISSUER

服務器證書的發行者字段

CERT_SERVER_SUBJECT

服務器證書的主題字段

HTTPS

如果請求穿過安全通道(SSL),則返回ON。如果請求來自非安全通道,則返回OFF

HTTPS_KEYSIZE

安全套接字層連接(SSL)密鑰的位數,如128

HTTPS_SECRETKEYSIZE

服務器證書私鑰的位數,如1024

HTTPS_SERVER_ISSUER

服務器證書的發行者字段

HTTPS_SERVER_SUBJECT

服務器證書的主題字段

注意:Request.ClientCertificate方法通過SubjectIssuer所獲得的相關主題信息在包含中文的情況下是亂碼;通過Request.ServerVaribles數據集合獲得證書持有者的主題信息和證書頒發機構的主題信息沒有亂碼問題。

3.示例代碼

以下代碼讀取客戶端證書並顯示其詳細信息。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>

<head><TITLE>證書測試</TITLE>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<%

SerialNumber  = Request.ClientCertificate("SerialNumber")

Subject=Request.servervariables("CERT_SUBJECT")

tempSubject=split(Subject,",")

for i=0 to ubound(tempSubject)

temp = split(tempSubject(i),"=")

if trim(temp(0))="CN" then

SubjectCN=temp(1)

end if

if trim(temp(0))="O" then

SubjectO=temp(1)

end if

if trim(temp(0))="OU" then

SubjectOU=temp(1)

end if

if trim(temp(0))="L" then

SubjectL=temp(1)

end if

if trim(temp(0))="S" then

SubjectS=temp(1)

end if

if trim(temp(0))="C" then

SubjectC=temp(1)

end if

next

         session("certSerial")         = SerialNumber

         session("certSubject")      = Subject

%>

<META content="MSHTML 6.00.2900.3020" name=GENERATOR>

</head>

<BODY>

  <table>

    <%if   len(SerialNumber) >5 then %>

    <tr>

      <td width="100%">

        <b>

 <% Response.Write " 持有者信息:<br>"%></b>

      <P></P>

         <%Response.Write  Subject  %>

        <table width="95%" border="1" bordercolor="#cc9933">

          <tr bgcolor="#99ffff">

            <td width="47%"><FONT face=宋體>姓名: </FONT> </td>

            <td width="53%"><font size="3" color="#ff3333"><%Response.Write  SubjectCN  %><FONT face=宋體></FONT></font></td>

          </tr>

          <tr>

            <td width="47%"><FONT face=宋體>您的 E-mail 地址:

            </FONT>   </td>

            <td width="53%"><font size="3" color="#ff3333"><%Response.Write  Request.ClientCertificate("SubjectEMAIL")  %><FONT face=宋體></FONT></font></td>

          </tr>

          <tr bgcolor="#99ffff">

            <td width="47%"><FONT face=宋體>單位:</FONT></td>

            <td width="53%"><font size="3" color="#ff3333"><%Response.Write  SubjectO  %><FONT face=宋體></FONT></font></td>

          </tr>

          <tr>

            <td width="47%"><FONT face=宋體>部門: </FONT> </td>

            <td width="53%"><font size="3" color="#ff3333"><%Response.Write  SubjectOU  %><FONT face=宋體></FONT></font></td>

          </tr>

          <tr bgcolor="#99ffff">

            <td width="47%"><FONT face=宋體>城市: </FONT> </td>

            <td width="53%"><font size="3" color="#ff3333"><%Response.Write  SubjectL  %><FONT face=宋體></FONT></font></td>

          </tr>

          <tr>

            <td width="47%"><FONT face=宋體>省份: </FONT> </td>

            <td width="53%"><font size="3" color="#ff3333"><%Response.Write  SubjectS  %><FONT face=宋體></FONT></font></td>

          </tr>

          <tr bgcolor="#99ffff">

            <td width="47%"><FONT face=宋體>國家: </FONT> </td>

            <td width="53%"><font size="3" color="#ff3333"><%Response.Write  SubjectC  %><FONT face=宋體></FONT></font></td>

          </tr>

        </table>

        <p><font color="#003399" size="3" >   

        <% Response.Write " 發行者信息: <br>"%> </font>

        <table width="95%" border="1" bordercolor="#cc9933">

          <tr>

            <td width="47%" bgcolor="#99ffff"><FONT

            face=宋體>CN: </FONT> </td>

            <td width="53%" bgcolor="#99ffff"><FONT face=宋體><%Response.Write  Request.ClientCertificate("IssuerCN")  %><FONT></FONT></FONT></td>

          </tr>

          <tr>

            <td width="47%" bgcolor="#99ffff"><FONT

            face=宋體>單位:</FONT></td>

            <td width="53%" bgcolor="#99ffff"><FONT face=宋體><%Response.Write  Request.ClientCertificate("IssuerO") %><FONT></FONT></FONT></td>

          </tr>

          <tr>

            <td width="47%" bgcolor="#99ffff"><FONT

            face=宋體>城市: </FONT> </td>

            <td width="53%" bgcolor="#99ffff"><FONT face=宋體><%Response.Write  Request.ClientCertificate("IssuerL")  %><FONT></FONT></FONT></td>

          </tr>

          <tr>

            <td width="47%"><FONT face=宋體>省份: </FONT> </td>

            <td width="53%"><FONT face=宋體><%Response.Write  Request.ClientCertificate("IssuerS") %><FONT></FONT></FONT></td>

          </tr>

          <tr bgcolor="#99ffff">

            <td width="47%"><FONT face=宋體>國家:</FONT> </td>

            <td width="53%"><% Response.Write  Request.ClientCertificate("IssuerC") %></td>

          </tr>

        </table>

        <p><b><font color="#003399"  size="3">

<%  Response.Write " 序列號: " &session("certSerial") & "<br>"

Response.Write " 有效期自: " & Request.ClientCertificate("ValidFrom") & "  "

Response.Write " : " & Request.ClientCertificate("ValidUntil") & "<br>"       

         keysize = Request.ServerVariables("CERT_KEYSIZE")

         secretkeysize = Request.ServerVariables("CERT_SECRETKEYSIZE")

         Response.Write( "SSL連接密鑰長度: " & keysize & "<br>")

         Response.Write( "服務端證書私鑰長度:" & secretkeysize)

    Response.Write( "證書:" )    

          %></font></b> </p>

        </td>

          </tr>

          <tr>

      <td><font color="#ff3333" size="4"><b><font face="宋體"><%Response.Write "證書測試通過!!!<br>"%></font></b></font></td>

    </tr>

  <tr>

      <td align=middle></td>

    </tr>

   <%else%>

   <tr>

      <td>

        <div align="center">

          <p>&nbsp;</p>

          <p>&nbsp;</p>

          <p><b><font size="5"

      face=宋體>沒有提供有效的證書,</font></b></p>                

        </div> 

      <td><FONT face=宋體></FONT><tr><FONT face=宋體></FONT>

      <tr>

      <td>

        <div align="center">

          <p><FONT face=宋體></FONT>&nbsp;</p>         

          <p><b><font size="5"

      face=宋體>要想正確訪問該頁,</font></b></p>                

        </div>     

      <td><FONT face=宋體></FONT><tr><FONT face=宋體></FONT>

      <tr>

      <td>

        <div align="center">

          <p><FONT face=宋體></FONT>&nbsp;</p>      

          <p><b><font size="5"

      face=宋體>請到數字證書認證中心申請數字證書。</font></b></p>

          <p>&nbsp;</p>        

        </div>     

      <td><tr>

   <%end if%></tr>   

  </table>

</BODY>

</HTML>

該文件在附屬光盤的“Code/第五篇 電子商務網站應用-ASP/ssltest”目錄下。運行的效果如圖和圖所示。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章