2017-12-20 11 views
0

私はAndroid AppでRetrofitを使用しています。私が 'https://example.com'をベースURLとしてリクエストすると正常に動作します。しかし、私が 'https://www.example.com'をベースURLとしてリクエストすると、SSLHandshakeExceptionが返されます。私はなぜそれが起こっているのか理解していない。RetrofitはSSLHandshakeExceptionを返します

+0

retrofitドキュメントをお読みになりましたか?そこに記載されている可能性があります –

+0

ええ私はドキュメントを通過しました。私はどこにでもそれについて記述するのを見たことがありません。 –

答えて

0

OkHttpでは、古いHTTPS設定のサポートが削除されており、到達しようとしているホスト を更新する必要があります。

この古いサーバーをサポートするには、OkHttpで暗号スイートとTLSバージョンを構成できます。

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

私の理解から、これは、すべての重複しているCipherSuiteが使用されていることを確認します。ここで私は別のAndroidのバージョンでそれをテストから得た結果である: -
5.0作業 -
4.4.4作業 - エラー
4.3 -

OkHttp 2.3.0

5.1は、エラー
4.2.2 - エラー
4.1.1 - エラー
4.0 - エラー

OkHttp 2.2.0

5.1から
作業 - 作業
4.3 - -
4.4.4作業 -
4.2.2作業 -
4.1.1作業
5.0作業 4.0 - エラー

+0

サーバーにSSL証明書をインストールしました。この問題は、サーバー上で行われたいくつかの変更によって解決できますか? –

+0

私はそれが理由ではないと思う。 'https'を使わずに他のURLを試してみてください。 –

0

私は2.2.0

とtは

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以下がサーバ側にもインストールされていません。

+0

Glideライブラリでも同じことが起こっています。それは証明書の問題ですか?サーバーを変更する必要がありますか? –

+0

はい、試してみることができます。 – Dilip

+0

これを解決するには、サーバー上でどのような変更を行う必要がありますか。私たちは数日前にサーバー上のSSL証明書を変更しましたか? –

関連する問題