Jenkins systemd服务忽略JVM属性致HTTPS报trustAnchors错误
问题根因
- 新版Jenkins官方deb/rpm安装包已不再读取
/etc/default/jenkins下的配置,所有服务启动参数统一由systemd单元管理,因此写入该文件的JVM参数被忽略属于预期行为。 - 你配置systemd环境变量时,给
JAVA_OPTS的值额外添加了转义双引号,导致JVM解析参数时,将整串参数识别为单个带引号的字符串,而非多个独立的-D启动参数,因此SSL信任库相关配置实际未被JVM加载——ps命令显示参数存在只是因为字符串本身被传入了进程,但参数格式错误无法被JVM识别。 - 报错
trustAnchors parameter must be non-empty的本质是JVM无法找到或读取有效的CA根证书信任库,无法验证HTTPS连接的服务端证书合法性。
排查步骤
- 首先验证系统信任库文件有效性:执行命令
keytool -list -keystore /etc/ssl/certs/java/cacerts -storepass changeit -storetype pkcs12
如果命令执行报错无法列出证书条目,先执行以下命令修复系统证书库:
apt install --reinstall ca-certificates ca-certificates-java update-ca-certificates
- 检查信任库文件权限:执行
ls -l /etc/ssl/certs/java/cacerts,确认文件权限为644,jenkins用户对文件有读取权限,若权限不足执行chmod 644 /etc/ssl/certs/java/cacerts修复。 - 检查systemd实际传递的环境变量:执行
systemctl show jenkins --property=Environment,确认JAVA_OPTS的值没有多余的转义引号、参数之间为空格分隔。 - 验证JVM实际加载的参数:在JAVA_OPTS中保留
-XshowSettings:properties参数,重启Jenkins后查看/var/log/jenkins/jenkins.log开头的JVM属性输出,查找javax.net.ssl.trustStore配置项,确认其值为/etc/ssl/certs/java/cacerts,若不存在该配置项说明参数未被正确解析。
修复方案
- 清除之前错误的systemd配置,执行
systemctl edit jenkins打开配置编辑页,写入以下正确配置(注意不要给JAVA_OPTS的值添加额外的转义双引号):
[Service] Environment="JENKINS_HOME=/data/jenkins" Environment="JAVA_OPTS=-Djava.awt.headless=true -XshowSettings:properties -Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts -Djavax.net.ssl.trustStorePassword=changeit -Djavax.net.ssl.trustStoreType=pkcs12"
- 重载systemd配置并重启Jenkins服务:
systemctl daemon-reload systemctl restart jenkins
- 重启后等待服务启动完成,验证插件搜索、Google OAuth登录等HTTPS场景功能是否恢复正常。确认功能正常后,可以删除JAVA_OPTS中的
-XshowSettings:properties调试参数减少不必要的日志输出。 - (可选永久修复,无需每次启动传JVM参数)找到当前Jenkins使用的JDK默认信任库路径(以OpenJDK 11为例,默认路径为
/etc/java-11-openjdk/security/cacerts),将系统证书库软链到该路径,JVM启动时会自动加载,无需额外传参:
# 先备份原有cacerts文件 mv /etc/java-11-openjdk/security/cacerts /etc/java-11-openjdk/security/cacerts.bak # 软链系统全局证书库 ln -sf /etc/ssl/certs/java/cacerts /etc/java-11-openjdk/security/cacerts
内容的提问来源于stack exchange,提问作者Alain Lavoie
相关产品推荐
相关产品推荐

