Play 2.4.x测试环境SSL验证忽略无效,求其他有效配置方案
Play 2.4.x 测试环境忽略SSL验证的解决方案
你遇到的错误:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
除了你已尝试的配置,可通过以下方式解决:
修正配置层级并补充信任管理器算法配置
Play 2.4.x的WS配置需在play.ws层级下,替换原有配置为:play.ws.ssl.trustManager.algorithm=PKIX play.ws.ssl.loose.acceptAnyCertificate=true play.ws.ssl.loose.disableHostnameVerification=true旧版本的根级
ws.acceptAnyCertificate=true可能不生效,需使用play.ws.ssl.loose下的对应配置。在测试代码中自定义不安全的WS客户端
直接通过代码创建忽略所有SSL验证的WS客户端,绕过配置限制:import play.libs.ws.WSClient; import play.libs.ws.WSConfigParser; import play.libs.ws.ning.NingWSClient; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.security.cert.X509Certificate; public WSClient createInsecureWSClient() throws Exception { // 信任所有证书的TrustManager TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { @Override public X509Certificate[] getAcceptedIssuers() { return null; } @Override public void checkClientTrusted(X509Certificate[] certs, String authType) {} @Override public void checkServerTrusted(X509Certificate[] certs, String authType) {} } }; // 初始化SSL上下文 SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); // 构建自定义WS客户端配置 WSConfigParser configParser = new WSConfigParser(play.api.Play.current().configuration()); com.ning.http.client.AsyncHttpClientConfig.Builder clientConfig = configParser.parse(); clientConfig.setSSLContext(sslContext); clientConfig.setHostnameVerifier((host, session) -> true); // 忽略主机名校验 return new NingWSClient(clientConfig.build()); }测试时使用该客户端发起请求即可。
验证测试环境配置加载情况
确保测试代码正确加载了test环境的application.conf,可添加打印代码确认配置是否生效:import play.Configuration; // 在测试初始化时打印配置 System.out.println("SSL宽松配置状态: " + Configuration.root().getString("play.ws.ssl.loose.acceptAnyCertificate"));
内容的提问来源于stack exchange,提问作者Niko
相关产品推荐
相关产品推荐

