前言
我们知道jdk自带的keytool工具可以帮助提供https支持,使用下面步骤:
生成服务器证书,有效时间100年、证书别名为serverkey、生成文件名为server.keystore:
1
keytool -genkey -v -alias serverkey -keyalg RSA -keystore server.keystore -validity 36500
生成客户端证书,有效时间100年、证书别名为clientkey 、生成文件名为client.p12:
1
keytool -genkey -v -alias clientkey -keyalg RSA -storetype PKCS12 -keystore client.p12 -validity 36500
根据客户端证书(证书别名是clientkey、文件为client.p12)生成客户端p12证书信任文件,生成文件名为client.cer、密码为123456:
1
keytool -export -alias clientkey -keystore client.p12 -storetype PKCS12 -storepass 123456 -rfc -file client.cer
将信任证书导入到服务器server.keystore中:
1
keytool -import -v -file client.cer -keystore server.keystore
修改server.xml:
1
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="/opt/apache-tomcat-8.0.3/cert/tomcat.keystore" keystorePass="197347" />
clientAuth 是否开启客户端证书验证(双向认证): true开启/false关闭。如果clientAuth 为 true. 那么客户端需有 client.p12文件才能访问tomcat服务器。但是这种方式访问域名时,浏览器会标识“证书风险”,并且默认不会加载非HTTPS域名下的JavaScript。我们需要正规的证书。
申请免费https证书
登录控制台,找到证书服务,选择品牌:Symantec,证书类型将出现:免费型DV SSL。后面就直接安装指示一步步进行就可以了。
配置https
拿到证书之后,进行下载,选择“下载证书 for Tomcat”。因此我们会得到一个压缩文件,需要的证书都在里面了。接下来我们进行https的配置,配置这儿是个大坑,博主在这儿绕了几段弯路。由于tomcat8及以上和以下的https配置完全不同,而且阿里云https证书安装分pfx格式和jks格式两种,因此就存在以下四种配置:
配置情况一(tomcat8以下+pfx):
这种配置是最容易的,按照阿里云https证书安装过程做,一般不会出现什么问题。我的配置:1
2
3
4
5
6
7
8
9
10
11<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
keystoreFile="cert/你的pfx证书文件.pfx" keystorePass="你的证书密码(pfx-password.txt文件中)"
clientAuth="false" sslProtocol="TLS"
ciphers="TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_RSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
TLS_RSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
SSL_RSA_WITH_3DES_EDE_CBC_SHA,
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA" />
配置情况二(tomcat8以下+jks):
同上,只是把“你的pfx证书文件.pfx”和密码换成jks相关即可。
注意,如果发现配置完成之后,启动tomcat启动443时报“Password verification failed”的错误,有两点原因可以考虑:
- 你的jks证书密码是否和密钥库密码一致(阿里云建议两者一致);
- 使用jdk自带工具keytool生产证书时可能密码会默认成“changeit”,把你的密码换成这个试试。
一般使用阿里云上申请的证书时,我尽量不使用keytool来转换jks证书。因为正如上面所说,证书密码可能会默认成“changeit”。而证书密码和密钥库密码不一致又可能出现“Cannot recover key”错误(密钥库密码给你时就已经定好了)。因此你会陷入一个进退两难的地步(当然肯定也有解决办法,只是为了避免不必要的麻烦,而且tomcat7以上开始支持pfx证书)。
配置情况三(tomcat8及以上+jks):
1 | <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true"> |
证书别名是需要的,默认就是“alias”,你也可以在生成jks文件指定别名:1
keytool -importkeystore -srckeystore [你的pfx证书.pfx] -alias [你的证书别名] -destkeystore [你的jks证书名.jks] -srcstoretype PKCS12 -deststoretype JKS
你也可以查看你的证书别名:1
keytool -list -keystore [jks文件] -storepass [jks密码]
配置情况四(tomcat8及以上+pfx):
参照上面,略
再访问https域名,就没毛病了:
最后
还有一个小坑就是,linux上记得把防火墙443端口或8443端口打开,否则一直都是连接不上的。/etc/sysconfig/iptables
文件加上:1
2# https default
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
重启防火墙:1
service iptables restart
当然,如果你正在使用Apache或者Nginx做反向代理或负载均衡,那就可以直接在Apache或Nginx中配置https即可,Tomcat就可以不用管它了。
更多文章,请关注:开猿笔记