问题描述
我创建了一些默认的 OkHttpClient。需要测试一下。在我的测试中,我向 MockWebServer 发出请求。当我发出 http/1.1 请求时 - 一切正常。但是 http/2 请求失败并出现错误:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building Failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
他错过了哪些证书?从服务器端:我给了服务器 HandshakeCertificates
,告诉他不要验证客户端。
在客户方面,我将他配置为相信每个人(如果我错了,请纠正我)。
有什么问题?
如何创建客户端:
public static OkHttpClient createDefaultClient(String secureSocketProtocol) {
OkHttpClient client = null;
try {
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore)null);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
if (trustManagers.length != 1 || !(trustManagers[0] instanceof x509trustmanager)) {
throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers));
}
x509trustmanager trustManager = (x509trustmanager) trustManagers[0];
SSLContext sslContext = SSLContext.getInstance(secureSocketProtocol);
sslContext.init(null,new TrustManager[] { trustManager },null);
client = new OkHttpClient.Builder()
.sslSocketFactory(sslContext.getSocketFactory(),trustManager)
.build();
} catch (Exception e) {
LogUtils.error(thisClass,"Failed to create default HttpClient",e);
return null;
}
return client;
}
我的测试:
public class HttpClientTest {
private MockWebServer server;
private String endpoint = "myendpoint";
private String serverResponse = "Server response";
@Before
public void setUp() throws IOException {
this.server = new MockWebServer();
server.enqueue(new MockResponse().setBody(serverResponse));
HandshakeCertificates handshakeCertificates = localhost();
SSLSocketFactory socketFactory = handshakeCertificates.sslSocketFactory();
server.useHttps(socketFactory,false);
server.noClientAuth();
server.start();
}
@After
public void shutDown() throws IOException {
this.server.shutdown();
}
@Test
public void defaultClienttest() throws IOException {
OkHttpClient client = HttpClientFactory.createDefaultClient("TLS");
Assert.assertNotNull(client);
HttpUrl url = this.server.url(this.endpoint);
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
String responseBodyString = response.body().string();
Assert.assertEquals(this.serverResponse,responseBodyString);
Assert.assertEquals(200,response.code());
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)