2017-01-09 11 views
2

IPアドレス(一般名ではありません)に対して発行された証明書を取得しており、その証明書を持つサーバーに接続するためにtriyngです。android retrofitホスト名が確認されていません

OkHttpClient.Builder builder = new OkHttpClient().newBuilder(); 
OkHttpClient okHttpClient = builder.build(); 
Gson gson = new GsonBuilder() 
       .setLenient() 
       .create(); 
retrofit = new Retrofit.Builder() 
       .baseUrl(url) 
       .client(okHttpClient) 
       .addConverterFactory(GsonConverterFactory.create(gson)) 
       .build(); 
ServerRouts service = retrofit.create(ServerRouts.class); 
Resp_json> call = service.login(param, user, pw); 

と私はエラーました:

Hostname 11.8.222.333 not verified: 

を私は

builder.hostnameVerifier(new HostnameVerifier() { 
       @Override 
       public boolean verify(String hostname, SSLSession session) { 
        return true; 
       } 
      }); 

を使用するときにすべての作品。

ホスト名ベリファイアをオフにしないでそのエラーを解決するにはどうすればよいですか?

P.S.私の証明書はIP(11.8.222.333)

+0

あなたがレトロフィットで問題を確認する必要があるよりも機能している場合は、レストクライアントを使用して一度チェックしてください! –

答えて

1

のように再定義されました(DefaultHostnameVerifier.javaからコピーされたソース)。なぜそれがうまくいかなかったのか分かりませんが、今は大丈夫です。

builder.hostnameVerifier(new HostnameVerifier() { 
      @Override 
      public boolean verify(String hostname, SSLSession session) { 

       Certificate[] certs; 
       try { 
        certs = session.getPeerCertificates(); 
       } catch (SSLException e) { 
        return false; 
       } 
       X509Certificate x509 = (X509Certificate) certs[0]; 
       // We can be case-insensitive when comparing the host we used to 
       // establish the socket to the hostname in the certificate. 
       String hostName = hostname.trim().toLowerCase(Locale.ENGLISH); 
       // Verify the first CN provided. Other CNs are ignored. Firefox, wget, 
       // curl, and Sun Java work this way. 
       String firstCn = getFirstCn(x509); 
       if (matches(hostName, firstCn)) { 
        return true; 
       } 
       for (String cn : getDNSSubjectAlts(x509)) { 
        if (matches(hostName, cn)) { 
         return true; 
        } 
       } 
       return false; 

      } 
     }); 


private String getFirstCn(X509Certificate cert) { 
     String subjectPrincipal = cert.getSubjectX500Principal().toString(); 
     for (String token : subjectPrincipal.split(",")) { 
      int x = token.indexOf("CN="); 
      if (x >= 0) { 
       return token.substring(x + 3); 
      } 
     } 
     return null; 
    } 
+0

ここでgetFirstCn(x509)メソッドは何ですか – Nainal

+0

私は自分の答えを編集しました。 – Rainmaker

関連する問題