RestAssured测试遇SSL握手失败,如何禁用SSL验证?
问题
在无SSL证书的环境中运行RestAssured自动化测试时,首次调用抛出如下异常:
javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:371) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:314) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:309)
已尝试两种配置修改,但均未解决问题:
第一种配置:
public static void addHeadersToRequestsSpecifications(Map<String, String> authHeaders, String cookieValue) { API.addRequestSpec(new RequestSpecBuilder() .setConfig(RestAssuredConfig.newConfig().sslConfig(new SSLConfig().relaxedHTTPSValidation())) .addHeader("cookie", cookieValue) .addHeader("Accept", "application/json, text/plain, */*") .addHeader(TOKEN, authHeaders.get(this.token)) .addFilter(new AllureRestAssured()) .build()); }
第二种配置:
public static void addHeadersToRequestsSpecifications(Map<String, String> authHeaders, String cookieValue) { API.addRequestSpec(new RequestSpecBuilder() .setConfig(RestAssured.config().sslConfig(new SSLConfig().allowAllHostnames())) .addHeader("cookie", cookieValue) .addHeader("Accept", "application/json, text/plain, */*") .addHeader(TOKEN, authHeaders.get(this.token)) .addFilter(new AllureRestAssured()) .build()); }
环境信息:Java 17.0.4,RestAssured 5.1.1
请问如何禁用SSL验证?
解决方法
1. 全局配置放松SSL验证
在测试初始化阶段执行一次全局配置,让所有请求自动跳过SSL证书验证:
// 全局启用放松HTTPS验证 RestAssured.useRelaxedHTTPSValidation();
或指定协议版本(适配Java 17的默认协议限制):
RestAssured.config = RestAssured.config() .sslConfig(new SSLConfig().relaxedHTTPSValidation("TLS"));
2. 确保RequestSpec被正确应用
检查自定义API.addRequestSpec方法是否将配置绑定到了实际请求中。如果是单请求场景,可直接在请求内指定SSL配置:
given() .config(RestAssuredConfig.newConfig().sslConfig(new SSLConfig().relaxedHTTPSValidation())) .header("cookie", cookieValue) .header("Accept", "application/json, text/plain, */*") .header(TOKEN, authHeaders.get(TOKEN)) .filter(new AllureRestAssured()) .when() .get("/target-endpoint");
3. Java 17专属JVM参数调整
Java 17对SSL校验更严格,可添加以下JVM启动参数放宽限制:
-Djdk.tls.client.protocols=TLSv1.2,TLSv1.3 -Djavax.net.ssl.trustStoreType=JKS -Djavax.net.ssl.trustStore=/path/to/empty-truststore.jks
若不想创建空信任库,可临时使用以下参数强制忽略证书校验(仅测试环境用):
-Dsun.security.ssl.allowUnsafeRenegotiation=true -Dcom.sun.net.ssl.checkRevocation=false
4. 自定义信任所有证书的SSL上下文
如果上述方法无效,手动构建信任所有证书的SSL上下文并配置给RestAssured:
import org.apache.http.ssl.SSLContexts; // 构建信任所有证书的SSL上下文 SSLContext sslContext = SSLContexts.custom() .loadTrustMaterial((chain, authType) -> true) .build(); // 配置RestAssured使用该上下文 RestAssured.config = RestAssured.config() .sslConfig(new SSLConfig().sslContext(sslContext).allowAllHostnames());
内容的提问来源于stack exchange,提问作者Ali Taha
相关产品推荐
相关产品推荐

