0

I have been working on Sky scanner API to retrieve the flight fares and other details in android.

I'm using the Retrofit2 for network calls. The problem is getting error in retrieving the Session key

Error

javax.net.ssl.SSLPeerUnverifiedException: Hostname partners.api.skyscanner.net not verified:certificate: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=DN:CN=api.skyscanner.net,OU=Infrastructure,O=Skyscanner Ltd,L=London,ST=London,C=GB

APIClient

    public static Retrofit getRetrofit() {
    if (retrofit2 == null) {
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).hostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
                return hv.verify("partners.api.skyscanner.net", session);
            }
        }).build();

        retrofit2 = new Retrofit.Builder()
                .baseUrl(SKY_BASE_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    return retrofit2;
}

Referred SO links of SSLPeerUnverifiedException in android

Link1 Link2

Community
  • 1
  • 1
iSrinivasan27
  • 1,406
  • 1
  • 21
  • 28
  • 1
    Have you tried `return hv.verify("api.skyscanner.net", session);` instead? – BNK Sep 12 '16 at 08:24
  • 1
    Thanks bro. I fixed it – iSrinivasan27 Sep 12 '16 at 08:58
  • 1
    Ok, please read https://developer.android.com/training/articles/security-ssl.html#CommonHostnameProbs, pay attention from `One reason this can happen is due to a server configuration error. The server is configured with a certificate that does not have a subject or subject alternative name fields that match the server you are trying to reach...` – BNK Sep 12 '16 at 09:03
  • @BNK I go through the article. Thanks again. – iSrinivasan27 Sep 12 '16 at 09:18

2 Answers2

3

I fixed the issue with help of BNK Comments

  1. Add HostnameVerifier() in the OkhttpClient object
  2. Check the hostname before adding it in hv.verify(hostname, session);

Fixed Code for reference

 if (retrofit2 == null) {
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).hostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
                return hv.verify("api.skyscanner.net", session);
            }
        }).build();

        retrofit2 = new Retrofit.Builder()
                .baseUrl(SKY_BASE_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
iSrinivasan27
  • 1,406
  • 1
  • 21
  • 28
0

I resolved this by adding a hostname verifier and returning it to true.

OkHttpClient client = new OkHttpClient.Builder()
                    .hostnameVerifier(new HostnameVerifier() {
                        @Override
                        public boolean verify(String hostname, SSLSession session) {
                            HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
                            return true;
                        }
                    })
                    .connectTimeout(100, TimeUnit.SECONDS)
                    .readTimeout(100, TimeUnit.SECONDS).build();