Tomcat启动后Confluence TLS握手耗时过长问题求助
解决Confluence Tomcat启动初期TLS握手卡顿问题
嗨,我来帮你捋一捋这个Tomcat刚启动时TLS握手卡几分钟的问题——这种场景我在维护老版本Confluence环境时碰到过好几次,大概率和启动阶段的阻塞式加密操作有关,结合你用的是Ubuntu 16.04+Let's Encrypt证书的环境,给你几个针对性的排查和解决方向:
1. 先排查系统熵池不足的问题
Tomcat生成TLS会话密钥需要足够的系统随机熵,Ubuntu 16.04默认用的/dev/random是阻塞式的,当系统熵值不够时,会直接卡住等待熵生成。
- 先检查当前熵值:
如果输出低于1000,基本可以确定是这个问题。cat /proc/sys/kernel/random/entropy_avail - 解决办法:
- 安装
rng-tools来补充系统熵:sudo apt-get update && sudo apt-get install rng-tools sudo systemctl start rng-tools sudo systemctl enable rng-tools - 或者修改Confluence的JVM启动参数(在
setenv.sh里添加),让JVM使用非阻塞的随机源:JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"
- 安装
2. 检查OCSP证书验证的阻塞问题
老版本Tomcat默认会开启OCSP(在线证书状态协议)验证,启动初期Confluence第一次建立TLS连接时,会向Let's Encrypt的OCSP服务器发起请求,如果网络延迟、DNS解析慢或者服务器响应超时,就会卡住几分钟。
- 临时测试验证:修改Confluence的Tomcat
server.xml里的SSL Connector配置,添加enableOCSP="false",比如:
重启Confluence后测试握手速度,如果不再卡顿,说明是OCSP的问题。<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" enableOCSP="false" keystoreFile="/path/to/your/letsencrypt.p12" keystorePass="your-keystore-password" keystoreType="PKCS12"/> - 长期解决方案:如果你的Confluence捆绑的Tomcat版本在8.5及以上,可以开启OCSP Stapling(把证书状态缓存到服务器,避免每次请求OCSP),在SSL Connector里添加:
ocspStapling="true" ocspStaplingResponderURL="http://ocsp.int-x3.letsencrypt.org/"
3. 验证密钥库的加载效率
Let's Encrypt证书转成Tomcat兼容的密钥库(比如PKCS12)时,如果格式有问题或者权限不足,也可能导致启动时加载缓慢。
- 用
keytool直接测试密钥库加载速度:
如果这个命令执行就卡,说明密钥库本身有问题,重新生成一次PKCS12格式的证书:keytool -list -keystore /path/to/your/keystore.p12 -storetype PKCS12 -storepass your-password
同时确保Tomcat运行用户(通常是openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name confluence -CAfile chain.pem -caname rootconfluence)对密钥库文件有读权限。
4. 分析strace输出定位阻塞点
你提到有strace输出,重点看卡顿期间的系统调用:
- 如果是
connect()/recvfrom()卡住,并且目标IP是Let's Encrypt的OCSP服务器(比如64.78.149.164),那就是OCSP验证的网络问题。 - 如果是
getrandom()/read()从/dev/random读取,那就是熵池不足的问题。 - 如果是
open()/read()卡住指向密钥库文件,检查文件所在存储的性能和权限。
总结
先从熵池不足和OCSP验证这两个最常见的点入手,这俩在老系统+老Tomcat的组合里最容易导致启动初期的TLS握手阻塞,排查起来也最快。
内容的提问来源于stack exchange,提问作者lucasart
相关产品推荐
相关产品推荐

