【问题标题】:javax.net.ssl.SSLPeerUnverifiedException Error in retrieving Session key from Skyscanner API - Androidjavax.net.ssl.SSLPeerUnverifiedException 从 Skyscanner API 检索会话密钥时出错 - Android
【发布时间】:2017-01-19 15:08:08
【问题描述】:

我一直在研究 Skyscanner API 以在 android 中检索航班票价和其他详细信息。

我正在使用 Retrofit2 进行网络调用。问题是检索会话密钥时出错

错误

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;
}

android中SSLPeerUnverifiedException的引用SO链接

Link1 Link2

【问题讨论】:

  • 你试过return hv.verify("api.skyscanner.net", session);吗?
  • 谢谢兄弟。我修好了
  • 好的,请阅读developer.android.com/training/articles/…,关注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 我浏览了这篇文章。再次感谢。

标签: android retrofit2 okhttp3


【解决方案1】:

我在 BNK 评论的帮助下解决了这个问题

  1. 在 OkhttpClient 对象中添加 HostnameVerifier()
  2. 在添加之前检查主机名 hv.verify(hostname, session);

固定代码供参考

 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();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    相关资源
    最近更新 更多