在完成配置客户端证书认证后,浏览器以https访问服务器的时候,会提示选择证书,之后,服务器端会验证证书。也就意味着只有拥有有效证书的客户端才能打开该网站。
以下是具体的配置过程。
1. 在服务器端生成相关证书
(1) 生成服务器证书容器。
/usr/java/jdk1.6.0_43/bin/keytool -validity 36500 -genkey -v -alias server_test -keyalg RSA -keystore server.keystore -dname "CN=105.12.201.31,OU=test,O=test,L=shanghai,ST=shanghai,c=cn" -storepass test001 -keypass test001
其中,
validity 指定了有效期多少天,
dname 设定了签名中包含的一些信息,其中注意,据说CN指定的ip地址需和访问的ip一致(未测试过不相同的时候是否就会拒绝)。
keyalg 指定签名的算法,RSA或者DSA
storepass和keypass分别指定容器存储密码和读取密码。设置成相同的密码,因为tomcat里只有一个密码的设置。
(2) 生成信赖的客户端证书容器
/usr/java/jdk1.6.0_43/bin/keytool -validity 36500 -genkey -v -alias server_test_trust -keyalg RSA -keystore server_trust.keystore -dname "CN=105.12.201.31,OU=test,O=test,L=shanghai,ST=shanghai,c=cn" -storepass test002 -keypass test002
(3) 生成客户端用秘钥对
/usr/java/jdk1.6.0_43/bin/keytool -validity 36500 -genkeypair -v -alias client_1 -keyalg RSA -storetype PKCS12 -keystore client_1.p12 -dname "CN=client_1,OU=test,O=test,L=shanghai,ST=shanghai,c=cn" -storepass test003 -keypass test003
导出客户端用证书
/usr/java/jdk1.6.0_43/bin/keytool -export -v -alias client_1 -keystore client_1.p12 -storetype PKCS12 -storepass test003 -rfc -file client_1.cer
(4) 将客户端用的证书导入至服务端信赖的客户端的证书容器
/usr/java/jdk1.6.0_43/bin/keytool -import -v -alias client_1 -file client_1.cer -keystore server_trust.keystore -storepass test002
2. 修改tomcat的配置文件 conf/server.xml
找到原先的https的配置部分,默认是处于注释状态,将它放开
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" />
修改为:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="true" sslProtocol="TLS" keystoreFile="${catalina.base}/keystore/server.keystore" keystorePass="test001" truststoreFile="${catalina.base}/keystore/server_trust.keystore" truststorePass="test002" />
3. web app中设置强制SSL访问
WEB-INF/web.xml中
<!-- 强制SSL,即http请求自动跳转成https --> <security-constraint> <web-resource-collection> <web-resource-name>SSL</web-resource-name> <url-pattern>/*</url-pattern><!-- 全站使用SSL --> </web-resource-collection> <user-data-constraint> <description>SSL required</description> <!-- CONFIDENTIAL: 确保传输数据不被修改,不能被查看 --> <!-- INTEGRAL: 确保传输数据不被修改 --> <!-- NONE: 不做特殊限制--> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>
4. 客户端PC导入上面生成的 client_test.cer 以及 client_test.p12 后,重启浏览器,即可访问
初次访问会弹出选择证书的对话框,选中导入的cer证书即可。