tomcat 部署 https
- 在 startssl 上申请认证, 最后你会得到两个文件: ssl.key 和 ssl.crt, 建立一个新目录, 把这两个文件拷贝到该目录
- 下载 https://www.startssl.com/certs/ca.pem 和 https://www.startssl.com/certs/sub.class1.server.ca.pem
- 运行
cat ssl.crt ca.pem sub.class1.server.ca.pem > chain.crt - 运行
openssl pkcs12 -export -in chain.crt -inkey ssl.key -out keystore.pkcs12 -name tomcat
使用密码 "PASSWORD" - 运行 (可选, 该步为校验步骤)
keytool -list -rfc -keystore keystore.pkcs12 -storetype pkcs12
注意: 结果中要含有如下的一行 "Certificate chain length: 3" - 运行
keytool -importkeystore -srckeystore keystore.pkcs12 \
-srcstoretype PKCS12 -destkeystore keystore \
-srcalias tomcat -destkeypass PASSWORD
(注意: 此处的 PASSWORD 需要与目标 store 的密码一致) - 运行
cp keystore $TOMCAT_HOME/conf/ - 修改 $TOMCAT_HOME/conf/server.xml, 去掉 SSL Connector 附近的注释, 内容如下:
<Connector URIEncoding="UTF-8" port="443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="conf/keystore"
keystorePass="********"
keyAlias="tomcat"
/> - 把其余的 redirectPort="8443" 改为 redirectPort="443"
- 重启 tomcat
- 调整防火墙,启用 443 端口
- 备份 ssl.key 和 ssl.crt 到安全位置, 删除整个目录, 设置 $TOMCAT/conf/keystore 的属主为 tomcat 的运行用户, 设置权限为 640 或更低权限
注意事项:
- ssl.crt ca.pem sub.class1.server.ca.pem 都必须是 PEM 格式 (看起来类似base64)
- 所有步骤中建议使用同一套密码
- 此处对密码的要求不是很高, 因为运营机器上的 root 用户能同时拿到 keystore 和 server.xml, 密码再复杂也无效, 非 root 用户拿不到 keystore, 所以是安全的
- 如果有更高的安全要求, 建议修改 tomcat 的启动脚本, 在启动时手动输入密码, 设置为环境变量, 然后在 server.xml 中使用环境变量来获得密码 (仍然有问题, root 不在自己手上, 安全经常是幻像)
- Firefox, Chrome, IE 下均不会报警, 但 Java 客户端仍然不能使用, 解决方法如下
- 运行: wget https://www.startssl.com/certs/ca.pem
- 运行: keytool -importcert -trustcacerts -file ca.pem -keystore foo -storepass changeit
- 把 foo 拷贝到你的程序中
-
把如下两行代码加到你的程序 main 函数中:
System.setProperty("javax.net.ssl.trustStore", "/path/to/foo");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");