2015-08-03 4 views
0

Я пытаюсь оформить пост запроса в следующем порядке:HttpClient HTTPS Сообщение запрос не

  • Я использую Apache в HttpClient3,1
  • Я использую кодирующий «применение/х-www- форм-urlencoded»
  • URL, я использую начинается с HTTPS

это код, который я пытаюсь запустить:

public static String httpsPost(String url, String body, String mediaType, String encoding) { 
    disableCertificateValidation(); 
    HttpClient client = new HttpClient(); 
    StringRequestEntity requestEntity = new StringRequestEntity(body, mediaType, encoding); 
    PostMethod method = new PostMethod(url); 
    method.setRequestEntity(requestEntity); 
    client.executeMethod(method); 
} 

public static void disableCertificateValidation() { 
    // Create a trust manager that does not validate certificate chains 
    TrustManager[] trustAllCerts = new TrustManager[] { 
      new X509TrustManager() { 
       public X509Certificate[] getAcceptedIssuers() { 
        return new X509Certificate[0]; 
       } 
       public void checkClientTrusted(X509Certificate[] certs, String authType) {} 
       public void checkServerTrusted(X509Certificate[] certs, String authType) {} 
      }}; 

    // Ignore differences between given hostname and certificate hostname 
    HostnameVerifier hv = new HostnameVerifier() { 
     public boolean verify(String hostname, SSLSession session) { return true; } 
    }; 

    // Install the all-trusting trust manager 
    try { 
     SSLContext sc = SSLContext.getInstance("SSL"); 
     sc.init(null, trustAllCerts, new SecureRandom()); 
     HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
     HttpsURLConnection.setDefaultHostnameVerifier(hv); 
    } catch (Exception e) {} 
} 

При выполнении executeMethod Ловлю:

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 

Я пытался disable certificate validation, но это не помогло.

+1

отправьте полный код настройки вашего HTTP-клиента, включая инициализацию и настройку SSLContext. Кроме того, какую версию HttpClient вы используете? 3? 4? –

ответ

0

Я переработан мой старый код для обработки HTTPS. Теперь он работает и выглядит так:

public static String httpsPost(String url, String body, String mediaType, String encoding) { 
    SSLContext ctx; 
    ctx = SSLContext.getInstance("TLS"); 
    ctx.init(new KeyManager[0], new TrustManager[]{new DefaultTrustManager()}, new SecureRandom()); 
    SSLContext.setDefault(ctx); 
    HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory()); 

    URL serverUrl = new URL(url); 

    HttpsURLConnection con = (HttpsURLConnection) serverUrl.openConnection(); 

    con.setRequestMethod("POST"); 
    con.setDoOutput(true); 
    con.connect(); 

    OutputStreamWriter post = new OutputStreamWriter(con.getOutputStream()); 
    post.write(body); 
    post.flush(); 

    BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); 
    String inputLine; 
    String content = ""; 
    while ((inputLine = in.readLine()) != null) { 
     content += inputLine; 
    } 
    post.close(); 
    in.close(); 

    return content; 
} 
3

Если вы хотите игнорировать сертификат все вместе, то посмотрите на ответ здесь Ignore self-signed ssl cert using Jersey Client

Хотя это сделает ваше приложение уязвимым для человека-в-середине атак.

Вы можете вместо этого попробовать добавить сертификат в свой java-магазин в качестве доверенного сертификата. Этот сайт может быть полезен. http://blog.icodejava.com/tag/get-public-key-of-ssl-certificate-in-java/

Вот еще один ответ, показывающий, как добавить сертификат в свой магазин. Java SSL connect, add server cert to keystore programatically

Ключ

KeyStore.Entry newEntry = new KeyStore.TrustedCertificateEntry(someCert); 
ks.setEntry("someAlias", newEntry, null);` 
+0

Как я уже упоминал в своем вопросе, я попытался проигнорировать. Это не работает. – Igor

+0

Затем попробуйте добавить сертификат в свой java-магазин в качестве доверенного сертификата – arodriguezdonaire

+0

Дело в том, что, когда я выдаю запрос с помощью Postman, он преуспевает без добавления какого-либо сертификата или чего-либо еще. Я не понимаю, почему в моем коде это не – Igor

Смежные вопросы