在ASP/ASP.NET頁面上讀取客戶端數字證書有兩中方法,分別是讀取Request.ClientCertificate(key[SubField])和讀取Request.ServerVaribles(Server 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爲可選參數,用於按Subject或Issuer關鍵字檢索單獨的字段。此參數作爲一個後綴添加到Key參數中,如IssuerO或SubjectCN。下表列出了一些通用的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 |
客戶證書標誌,如有客戶端證書,則bit0爲0。如果客戶端證書驗證無效,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方法通過Subject和Issuer所獲得的相關主題信息在包含中文的情況下是亂碼;通過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> </p>
<p> </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> </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> </p>
<p><b><font size="5"
face=宋體>請到數字證書認證中心申請數字證書。</font></b></p>
<p> </p>
</div>
<td><tr>
<%end if%></tr>
</table>
</BODY>
</HTML>
該文件在附屬光盤的“Code/第五篇 電子商務網站應用-ASP/ssltest”目錄下。運行的效果如圖和圖所示。