11.4.2 服务验证
我们继续访问地址https://www.zlex.org/ssl/,这时将获得不一样的信息,如图11-29所示。
图 11-29 SSL/TLS协议中的request属性2
我们发现这里多了一项request属性—“javax.servlet.request.X509Certificate”,并且属性值是一个数组,该属性指向客户证书列表。
我们需要对index.jsp页面做细微调整,将该证书的相关信息打印到页面上。完整实现如代码清单11-12所示。
代码清单11-12 index.jsp页面2
<%@page language="java"contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.util.Enumeration, java.security.cert.X509Certificate"%>
<!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"content="text/html;charset=UTF-8">
<title>zlex.org</title>
</head>
<body>
<p>request属性信息
<pre>
<%
for(Enumeration en=request.getAttributeNames();en.hasMoreElements();){
String name=(String)en.nextElement();
out.println(name);
out.println("="+request.getAttribute(name));
out.println();
}
%>
</pre>
<p>数字证书信息
<pre>
<%
X509Certificate[]certs=(X509Certificate[])request.getAttribute
("javax.servlet.request.X509Certificate");
for(X509Certificate cert:certs){
out.println("版本:\t\t"+cert.getVersion());
out.println("序列号:\t\t"+cert.getSerialNumber());
out.println("颁布者:\t\t"+cert.getIssuerDN().getName());
out.println("使用者:\t\t"+cert.getSubjectDN().getName());
out.println("签名算法:\t"+cert.getSigAlgName());
out.println("证书类型:\t"+cert.getType());
out.println("有效期从:\t"+cert.getNotBefore());
out.println("至:\t\t"+cert.getNotAfter());
}
%>
</pre>
</body>
</html>
我们再次访问地址https://www.zlex.org/ssl/,将获得客户证书信息,如图11-30所示。
很显然,浏览器在访问该服务时,在request属性中载入客户证书。如果我们通过代码默认浏览器访问时,需要加载客户证书。
图 11-30 SSL/TLS协议中的request属性和客户证书信息