zoukankan      html  css  js  c++  java
  • retrofit2中ssl的Trust anchor for certification path not found问题

    在retrofit2中使用ssl,刚刚接触,很可能会出现如下错误。

    java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
    

    究其原因就是没有找到本地的证书。非常简单的错误。只要将证书放在本地就可以了。

    可是有时(比如说开发时、或者访问别人的https站点时),我们需要将其忽略。

    这时,我们就需要将其忽略。

    在iOS开发中,一句代码就可以解决。

    [operation.securityPolicy setValidatesDomainName:NO];
    

    但是在Android中使用了retrofit2后,却怎么也没有找到设置取消安全验证的方法。

    网上查了很久,都是重新设置一个OKHttpClient,在OKHttpClient中进行配置。

    但是我在使用中又出现了如下的问题:

    compile 'com.squareup.retrofit2:retrofit:2.0.2'

    我引用的retrofit包是2.0.2的,这个版本默认引用的OKHttp中,hostnameVerifier和sslSocketFactory是不可修改的。

    好吧,没办法,只能用反射解决此问题了···

     1         OkHttpClient sClient = new OkHttpClient();
     2  3         SSLContext sc = null;
     4         try {
     5             sc = SSLContext.getInstance("SSL");
     6             sc.init(null, new TrustManager[]{new X509TrustManager() {
     7                 @Override
     8                 public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {
     9 
    10                 }
    11 
    12                 @Override
    13                 public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {
    14 
    15                 }
    16 
    17                 @Override
    18                 public java.security.cert.X509Certificate[] getAcceptedIssuers() {
    19                     return null;
    20                 }
    21             }}, new SecureRandom());
    22         } catch (Exception e) {
    23             e.printStackTrace();
    24         }
    25 
    26         HostnameVerifier hv1 = new HostnameVerifier() {
    27             @Override
    28             public boolean verify(String hostname, SSLSession session) {
    29                 return true;
    30             }
    31         };
    32 
    33         String workerClassName="okhttp3.OkHttpClient";
    34         try {
    35             Class workerClass = Class.forName(workerClassName);
    36             Field hostnameVerifier = workerClass.getDeclaredField("hostnameVerifier");
    37             hostnameVerifier.setAccessible(true);
    38             hostnameVerifier.set(sClient, hv1);
    39 
    40             Field sslSocketFactory = workerClass.getDeclaredField("sslSocketFactory");
    41             sslSocketFactory.setAccessible(true);
    42             sslSocketFactory.set(sClient, sc.getSocketFactory());
    43         } catch (Exception e) {
    44             e.printStackTrace();
    45         }
    46 
    47         Retrofit retrofit = new Retrofit.Builder()
    48                 .baseUrl(URL)
    49                 .addConverterFactory(GsonConverterFactory.create())
    50                 .client(sClient)
    51                 .build();

    如上,就可以屏蔽掉ssl的证书验证了~

    如果有更好的办法,也请您告诉我~

  • 相关阅读:
    HDU4507 吉哥系列故事――恨7不成妻(数位dp)
    UCF Local Programming Contest 2017 G题(dp)
    ICPC Latin American Regional Contests 2019 I题
    UCF Local Programming Contest 2017 H题(区间dp)
    HDU2089 不要62
    AcWing1084 数字游戏II(数位dp)
    UCF Local Programming Contest 2017 F题(最短路)
    Google Code Jam 2019 Round 1A Pylons(爆搜+贪心)
    AcWing1083 Windy数(数位dp)
    Vue
  • 原文地址:https://www.cnblogs.com/maomishen/p/5403301.html
Copyright © 2011-2022 走看看