11.4.2 服务验证

我们继续访问地址https://www.zlex.org/ssl/,这时将获得不一样的信息,如图11-29所示。

figure_0397_0139

图 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属性中载入客户证书。如果我们通过代码默认浏览器访问时,需要加载客户证书。

figure_0399_0140

图 11-30 SSL/TLS协议中的request属性和客户证书信息