当前位置:首页 > 休闲

ssl部署到tomcat详细步骤

把SSL证书塞进Tomcat,部步骤本质上就三步:拿到证书文件、详细改一个配置文件、部步骤重启服务。详细但真做起来,部步骤坑比想象中多。详细我见过不少人卡在证书格式转换上,部步骤明明证书没问题,详细Tomcat就是部步骤报错——多半是格式不对。

先说你手里该有什么。详细正规CA签发的部步骤证书,通常会给你三个文件:证书本身(一般是详细.crt或.pem)、私钥(.key)、部步骤可能还有中间证书链。详细但Tomcat默认只认Java的部步骤keystore格式,也就是.jks或现在的.p12。所以第一步往往是转换格式,用openssl命令搞定。比如:
openssl pkcs12 -export -in yourcert.crt -inkey yourkey.key -out keystore.p12 -name tomcat -CAfile chain.crt -caname root
这条命令会生成一个.p12文件,里面打包了证书和私钥。注意,-name后面的别名最好用"tomcat",后面配置要对应。

拿到.p12后,把它放到Tomcat的conf目录下。然后打开server.xml,找到Connector配置。默认的HTTPS端口是8443,你搜一下"8443"就能看到被注释掉的配置。把它解开注释,改成这样:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/keystore.p12"
certificateKeystorePassword="你的密码"
certificateKeystoreType="PKCS12" />
</SSLHostConfig>
</Connector>

这里有个细节——如果你用的是Java 8以上版本,推荐用PKCS12格式而不是老旧的JKS,因为JKS是Java私有的,容易出兼容问题。

改完server.xml,还得检查一个地方:如果Tomcat前面有Nginx或Apache做反向代理,那你需要让Tomcat知道"用户是通过HTTPS访问的"。不然Tomcat内部的redirect规则会把用户踢回HTTP。这个在server.xml的Engine或Host里加个Valve:
<Valve className="org.apache.catalina.valves.RemoteIpValve"
protocolHeader="x-forwarded-proto" />

不加这个,你可能会遇到"页面能打开但登录后跳回HTTP"的诡异问题。

重启Tomcat,用curl -v https://localhost:8443测试一下。看到"SSL certificate verify ok"就说明证书链没问题。如果报错"unable to find valid certification path",多半是中间证书没装全。这时候把CA给的chain文件重新拼一下,或者用keytool导入到cacerts里临时解决——但生产环境最好还是把中间证书加到keystore里。

最后说个容易被忽略的点:Tomcat 8.5之后,默认启用了HTTP/2,但如果你用老式JKS格式,HTTP/2会失效。所以强烈建议用PKCS12。另外,如果证书是通配符或多域名证书,记得检查别名是否匹配——我见过有人把两个域名塞进一个keystore,结果Tomcat只认第一个,第二个域名访问直接握手失败。

整个过程最快十分钟搞定,但前提是你别在格式转换上纠结。实在不行,用keytool直接导入crt也行:
keytool -importcert -file yourcert.crt -keystore keystore.jks -alias tomcat
但这样私钥得单独处理,麻烦。直接上.p12,一步到位。

分享到: