SSL-http转https
前言
因为项目经理口头叙说,要访问时为https访问,我就在网上各种找帖子,本人菜鸟没做过此类的事情,然后实验几次之后终于成功了。所以我先记录下来,以防下次需要或者复习。
第一步:生成证书
我这里即为服务端又为客户端,所以我生成了五个文件;
1、生成服务器证书库
2、生成客户端证书库
3、从客户端证书库中导出客户端证书
4、从服务器证书库中导出服务器证书
5、生成客户端信任证书库(由服务器证书生成的证书库)
这些证书是由jdk的keytool来生成的,可以参考以下密钥生成脚本,根据实际情况做必要的修改,注意:服务端的密钥库参数“CN”必须与服务端的IP地址相同,否则会报错,客户端的任意。
1、生成服务器证书库
keytool -validity 365 -genkey -v -alias server -keyalg RSA -keystore E:\ssl\server.keystore -dname"CN=127.0.0.1,OU=bmsoft,O=bmsoft,L=bm,ST=ShangHai,c=sh" -storepass 123456
2、生成客户端证书库
keytool -validity 365 -genkeypair -v -alias client -keyalg RSA -storetype PKCS12 -keystore E:\ssl\client.p12 -dname"CN=client,OU=bmsoft,O=bmsoft,L=bm,ST=Shanghai,c=sh" -storepass 123456 -keypass 123456
3、从客户端证书库中导出客户端证书
keytool -export
-v -alias client -keystore E:\ssl\client.p12 -storetype PKCS12 -storepass 123456 -rfc -file E:\ssl\client.cer
4、从服务器证书库中导出服务器证书
keytool
-export -v -alias server -keystore E:\ssl\server.keystore -storepass 123456 -rfc -file E:\ssl\server.cer
5、生成客户端信任证书库(由服务器证书生成的证书库)
keytool -import -v -alias server -file E:\ssl\server.cer -keystore E:\ssl\client.truststore -storepass 123456
keytool常用命令参数,大家可以去网上查下最基本的keytool语法,此处用的大多是缺省值的方式。这五步好了后,到指定的文件夹中查看是否有这五个文件:
然后是最重要的一步:
将客户端证书导入到服务器证书库(使得服务器信任客户端证书)
keytool -import -v -alias
client -file E:\ssl\client.cer -keystore
E:\ssl\server.keystore -storepass 123456
注意:一定要看到已添加或者成功的字样!!!
第二步:配置web.xml文件
打开应用的web.xml文件,增加配置如下:
<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: 要保证服务器和client之间传输的数据不能够被修改
NONE: 指示容器必须能够在任一的连接上提供数据。(即用HTTP或HTTPS,由客户端来决定) -->
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
第三步:配置Tomcat服务器
<!--
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" /> -->
干掉注释,并将内容改为
<Connector SSLEnabled="true" acceptCount="100" clientAuth="true" disableUploadTimeout="true" enableLookups="false" keystoreFile="E:/ssl/server.keystore" keystorePass="123456" maxThreads="25" port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https" secure="true" sslProtocol="TLS" truststoreFile="E:/ssl/server.keystore" truststorePass="123456"/>