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