在OkHttp中信任所有证书

2025/03/30

1. 概述

在本教程中,我们将了解如何创建和配置OkHttpClient来信任所有证书

请参阅我们关于OkHttp的文章,了解有关该库的更多详细信息。

2. Maven依赖

让我们首先将OkHttp依赖添加到pom.xml文件中:

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>5.0.0-alpha.12</version>
</dependency>

3. 使用普通的OkHttpClient

首先,我们获取一个标准的OkHttpClient对象并调用一个证书已过期的网页:

OkHttpClient client = new OkHttpClient.Builder().build();
client.newCall(new Request.Builder().url("https://expired.badssl.com/").build()).execute();

堆栈跟踪输出将如下所示:

sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: validity check failed

现在,让我们看看当我们尝试使用自签名证书的另一个网站时收到的错误:

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

让我们尝试使用错误主机证书的网站:

Hostname wrong.host.badssl.com not verified

如我们所见,默认情况下,如果调用的站点证书不正确,OkHttpClient将抛出错误。接下来,我们将了解如何创建和配置OkHttpClient以信任所有证书。

4. 设置OkHttpClient来信任所有证书

让我们创建包含单个X509TrustManager的TrustManager数组,通过覆盖其方法来禁用默认证书验证:

TrustManager[] trustAllCerts = new TrustManager[]{
        new X509TrustManager() {
            @Override
            public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {
            }

            @Override
            public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {
            }

            @Override
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return new java.security.cert.X509Certificate[]{};
            }
        }
};

我们将使用这个TrustManager数组来创建SSLContext:

SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

然后,我们将使用这个SSLContext来设置OkHttpClient构建器的SSLSocketFactory:

OkHttpClient.Builder newBuilder = new OkHttpClient.Builder();
newBuilder.sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustAllCerts[0]);
newBuilder.hostnameVerifier((hostname, session) -> true);

我们还将新Builder的HostnameVerifier设置为一个新的HostnameVerifier对象,该对象的验证方法始终返回true。

最后,我们可以得到一个新的OkHttpClient对象并再次调用证书有问题的站点,而不会出现任何错误:

OkHttpClient newClient = newBuilder.build();
newClient.newCall(new Request.Builder().url("https://expired.badssl.com/").build()).execute();

5. 总结

在这篇简短的文章中,我们了解了如何创建和配置OkHttpClient来信任所有证书。当然,不建议信任所有证书。但是,在某些情况下我们可能需要它。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章