Jenkins执行Rest Assured自动化项目时遇SSL证书路径错误求助
解决Jenkins运行GitHub API自动化测试时的SSLHandshakeException问题
嘿,这个问题我之前也碰到过!本质是Jenkins使用的JVM没有信任GitHub的SSL证书——本地Eclipse和Maven命令行能正常跑,是因为你的本地JDK已经把GitHub的证书加入了信任库,但Jenkins的JVM(大概率是单独配置的,和你本地用的不是同一个)没做这一步,导致SSL握手时验证失败。
下面给你几个可行的解决方案,按推荐程度排序:
方案1:将GitHub的SSL证书导入Jenkins的JVM信任库(推荐,安全)
这是最规范的做法,步骤很清晰:
- 先导出GitHub的SSL证书:打开浏览器访问
https://api.github.com,点击地址栏的锁形图标,找到证书详情并导出(保存成.crt格式就行)。 - 找到Jenkins使用的JDK路径:进入Jenkins的「全局工具配置」,查看JDK的安装路径,找到其中的
jre/lib/security/cacerts文件(这是JVM的默认信任库)。 - 用Java自带的
keytool命令导入证书,命令格式如下:
默认的keytool -importcert -alias github-api-cert -file /你保存证书的路径/github.crt -keystore /Jenkins的JDK路径/jre/lib/security/cacertscacerts密码是changeit,执行时按提示输入密码,然后输入yes确认导入即可。 - 最后重启Jenkins服务,让信任库的更新生效。
方案2:在测试代码中临时禁用SSL验证(仅测试环境用!)
如果只是临时跑测试,不想折腾证书导入,可以用这个快捷方式,但生产环境绝对不能用,会完全跳过SSL证书验证,有安全风险:
用Rest Assured自带的配置(更简洁)
在测试类的初始化方法里加一行代码就行:
import io.restassured.RestAssured; import org.testng.annotations.BeforeSuite; public class BaseTest { @BeforeSuite public void setup() { // 禁用SSL证书验证 RestAssured.useRelaxedHTTPSValidation(); } }
通用Java代码绕过SSL验证
如果需要更底层的控制,也可以用这段代码:
import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.security.cert.X509Certificate; import org.testng.annotations.BeforeSuite; public class BaseTest { @BeforeSuite public void disableSSLCheck() throws Exception { TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } public void checkClientTrusted(X509Certificate[] certs, String authType) {} public void checkServerTrusted(X509Certificate[] certs, String authType) {} } }; SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); } }
方案3:让Jenkins使用和本地一致的JDK
有时候Jenkins配置的JDK和你本地开发用的不是同一个,导致信任库不同。你可以进入Jenkins的「全局工具配置」,把JDK的路径改成你本地正在用的那个JDK路径,这样Jenkins就能复用本地已经信任GitHub证书的信任库了,不用额外导入证书。
额外注意
如果你是用Docker部署的Jenkins,导入证书时要注意操作的是容器内的JDK路径,或者直接把本地的cacerts文件挂载到容器对应的路径下,避免容器重启后证书丢失。
内容的提问来源于stack exchange,提问作者Krishanu Chowdhury
相关产品推荐
相关产品推荐

