OkHttpClient 无法使用 http2 连接到 MockWebServer - 抛出 SSLHandshakeException

问题描述

我创建了一些认的 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 (将#修改为@)