2016-08-02 113 views
0

我已经创建了2个类: - 这个扩展了OkHttp并且有一个新方法getUnsafeOkHttpClient()。如何用ssl证书创建okhttp

public class GetExampleOkHttp extends OkHttpClient { 
    public OkHttpClient getUnsafeOkHttpClient() { 
     try { 
      // Create a trust manager that does not validate certificate chains 
      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 
      final SSLContext sslContext = SSLContext.getInstance("SSL"); 
      sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); 
      // Create an ssl socket factory with our all-trusting manager 
      final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); 
      OkHttpClient.Builder builder = new OkHttpClient.Builder(); 
      builder.sslSocketFactory(sslSocketFactory); 
      builder.hostnameVerifier(new HostnameVerifier() { 
       @Override 
       public boolean verify(String hostname, SSLSession session) { 
        return true; 
       } 
      }); 
      OkHttpClient okHttpClient = builder.build(); 
      return okHttpClient; 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

等主要类:

class ExampleOkHttpMain 
    public static void main(String[] args) throws IOException {  
     GetExampleOkHttp example = new GetExampleOkHttp();   
     example.getUnsafeOkHttpClient(); 

      Request request = new Request.Builder() 
       .url("https://lachuzhnikov.kiev.ua/test.txt") 
       .build(); 
      Response response = example.newCall(request).execute(); 
      System.out.println(response.body().string());  
    } 
} 

但我仍然有一个错误:

Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.ssl.Alerts.getSSLException(Unknown Source) at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source) at sun.security.ssl.Handshaker.fatalSE(Unknown Source)

回答

0

1:下载https://sourceforge.net/projects/portecle/
2:打开Firefox,然后转到页和出口CER
3:备份Java \ jdk .... \ jre \ lib \ security \ cacerts(例如:C:\ Program Files \ Java \ jdk1.7.0_79 \ jre \ lib \ security)
4:将cacerts复制到另一个文件夹
5:Portecle打开文件cacerts(pass:changeit)在步骤2中导入cer并保存
6:复制并替换新的cacerts Java \ jdk .... \ jre \ lib \安全\ cacerts