<security-constraint> <web-resource-collection> <web-resource-name>SSL</web-resource-name> <url-pattern>/SSLServlet</url-pattern> </web-resource-collection> <user-data-constraint> <description>SSL required</description> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>
说明:
如果不加入这个配置,那么所有访问的地址都必须要使用SSL才能访问,有时我们可能只需要通过某个或者某些SSL地址获取客户端证书来认证用户身份,认证成功后不需要使用SSL来进行访问。(可以配置多个security-constraint)
url-pattern:指定需要SSL才能进行访问的地址
transport-guarantee:合法值为NONE、 INTEGRAL或CONFIDENTIAL,transport-guarantee为NONE值将对所用的通讯协议不加限制。INTEGRAL值表示数据必须以一种防止截取它的人阅读它的方式传送。虽然原理上(并且在未来的HTTP版本中),在 INTEGRAL和CONFIDENTIAL之间可能会有差别,但在当前实践中,他们都只是简单地要求用SSL
创建SSLServlet获取客户端证书
五、测试用浏览器访问:8080/SSL/SSLServlet,细心的读者可能发现链接已经跳转到了https://127.0.0.1:8443/SSL/SSLServlet ,这是由于这个地址被设置为需要SSL才能访问,所以跳转到了这个地址。访问时页面提示如下:
由于我们这里是双向认证,所以也需要客户端的证书,我们接下来导入客户端证书:
双击client.p12
点击下一步
一直点击下一步直到完成证书安装(按照提示进行操作即可)
查看安装的客户端证书,由于我使用的Google Chrome浏览器(其他浏览器可能不同),设置 -> 高级设置 -> 管理证书
2. 重新访问上面的地址::8080/SSL/SSLServlet
浏览器提示选择客户端证书进行认证,我们点击【确定】,打开了一个警告页面,提示我们服务端证书不受信任
而且地址栏的图标有个小红叉:
当然我们直接点击是能打开的
为了不出现这样的警告信息,我们可以导入服务器端证书到客户端
a. 导入服务器端证书到客户端
双击server.cer
点击安装证书,然后选择证书的存储位置“受信任的根证书颁发机构”,一直点击下一步直到完成
查看我们安装的服务器端证书
b. 关闭浏览器,我们再访问
六、附录Keytool命令常用参数说明: