Retrofit提供SSLHandshakeException

时间:2017-12-20 05:10:23

标签: android retrofit retrofit2 okhttp3

我在Android应用中使用Retrofit。当我使用“https://example.com”作为基本网址发出请求时,它可以正常工作。但是,当我使用“https://www.example.com”作为基本URL发出请求时,它会给出SSLHandshakeException。我不明白为什么会这样。

2 个答案:

答案 0 :(得分:1)

我用它与2.2.0

创建不验证证书链的信任管理器

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

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

                    }

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

        // Install the all-trusting trust manager

        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient.Builder client = new OkHttpClient.Builder();
        client.interceptors().add(httpLoggingInterceptor);
        client.readTimeout(180, TimeUnit.SECONDS);
        client.connectTimeout(180, TimeUnit.SECONDS);

        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
       keyStore.load(null, null);

        SSLContext sslContext = SSLContext.getInstance("TLS");

        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
       trustManagerFactory.init(keyStore);
        KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        keyManagerFactory.init(keyStore, "keystore_pass".toCharArray());
        sslContext.init(null, trustAllCerts, new SecureRandom());
        client.sslSocketFactory(sslContext.getSocketFactory())
                .hostnameVerifier(new HostnameVerifier() {
                    @Override
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
               });

        Gson gson = new GsonBuilder().setLenient().create();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Common.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(client.build())
                .build();

        serviceApi = retrofit.create(Api.class);

感谢希望这会对你有所帮助。有时ssl 1.2或更低版本也没有安装在服务器端。

答案 1 :(得分:0)

  

OkHttp已删除对过时HTTPS配置的支持   您尝试达到需要更新的主机。

如果您不想这样做,可以在OkHttp中配置密码套件和TLS版本以支持这个过时的服务器。

https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/CustomCipherSuites.java

根据我的理解,这将确保使用所有重叠的CipherSuite。以下是我在不同Android版本上测试的结果:

OkHttp 2.3.0

  

5.1 - 工作
  5.0 - 工作
  4.4.4 - 错误
  4.3 - 错误
  4.2.2 - 错误
  4.1.1 - 错误
  4.0 - 错误

OkHttp 2.2.0

  

5.1 - 工作
  5.0 - 工作
  4.4.4 - 工作
  4.3 - 工作
  4.2.2 - 工作
  4.1.1 - 工作
  4.0 - 错误