2014-07-13 8 views
7

Je sais que cela a été demandé auparavant, mais j'ai essayé toutes les solutions que j'ai trouvées et cela ne fonctionne toujours pas. Fondamentalement, j'essaye d'obtenir du contenu via Apache Http Client (4.3) et le site Web que je connecte a quelques problèmes de SSL.Apache Http Client SSL erreur de certificat

D'abord, je recevais et SSLException avec et unrecognized_name message. J'ai essayé de contourner cela en définissant la propriété jsse.enableSNIExtension à false.

Ensuite, je suis arrivé cette exception: 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

J'ai ensuite essayé fournir mon won SSLFactory qui accepte tous les certificats, mais je reçois toujours la même exception. Voici mon code:

private static void sslTest() throws Exception { 
    System.setProperty("jsse.enableSNIExtension", "false"); 

    SSLContext sslContext = SSLContexts.custom() 
      .loadTrustMaterial(null, new TrustSelfSignedStrategy()) 
      .useTLS() 
      .build(); 

    SSLConnectionSocketFactory connectionFactory = 
      new SSLConnectionSocketFactory(sslContext, new AllowAllHostnameVerifier()); 

    CookieStore cookieStore = new BasicCookieStore(); 
    HttpClientContext context = HttpClientContext.create(); 
    context.setCookieStore(cookieStore); 

    CloseableHttpClient httpclient = HttpClients.custom() 
      .setSSLSocketFactory(connectionFactory) 
      .setDefaultCookieStore(cookieStore) 
      .build(); 

    URI uri = new URIBuilder() 
      .setScheme("https") 
      .setHost(BASE_URL) 
      .build(); 

    String responseBody = httpclient.execute(new HttpGet(uri), RESPONSE_HANDLER); 
} 

Toute aide est grandement appréciée!

+0

S'il vous plaît regarder ma réponse dans une autre question: https://stackoverflow.com/a/45734000/8477758 – EyouGo

Répondre

11

Veuillez également noter que faire confiance aux certificats auto-signés ne signifie pas faire confiance à un cert arbitraire. Essayez la configuration de votre contexte SSL ainsi:

SSLContext sslContext = SSLContexts.custom() 
     .loadTrustMaterial(null, new TrustStrategy() { 

      @Override 
      public boolean isTrusted(final X509Certificate[] chain, final String authType) throws CertificateException { 
       return true; 
      } 
     }) 
     .useTLS() 
     .build(); 

S'il vous plaît noter également que faire confiance généralement des certificats défaites sans discernement le but d'utiliser SSL en premier lieu. Utilisez nécessité absolue ou de seulement pour les tests

+1

travaillé comme un charme. Avec 'HttpClientBuilder', voici comment créer une instance:' SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory (sslContext); Client CloseableHttpClient = HttpClientBuilder.create(). SetSSLSocketFactory (sslsf) .build(); ' –

1

Votre fichier de clés certifiées ne fait pas confiance au certificat de serveur.

Autoriser tout nom d'hôte est une étape HTTPS qui peut uniquement être appelée si le certificat est approuvé.

9

En Http client 4.5.2:

SSLContext sslContext = SSLContexts.custom() 
      .loadTrustMaterial(null, new TrustStrategy() { 

       @Override 
       public boolean isTrusted(final X509Certificate[] chain, final String authType) throws CertificateException { 
        return true; 
       } 
      }) 
      .build(); 

    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
      sslContext, 
      NoopHostnameVerifier.INSTANCE); 

Et puis:

HttpClientBuilder builder = HttpClients.custom().setSSLSocketFactory(sslsf); 
0

Ce qui suit est pour Apache 4x confiance à tout

static { 
    // avoid error javax.net.ssl.SSLProtocolException: handshake alert: unrecognized_name 
    System.setProperty("jsse.enableSNIExtension", "false"); 
} 

public static HttpClientBuilder createTrustAllHttpClientBuilder() { 
    try { 
     SSLContextBuilder builder = new SSLContextBuilder(); 
     builder.loadTrustMaterial(null, (chain, authType) -> true); 
     SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build(), NoopHostnameVerifier.INSTANCE); 

     return HttpClients.custom().setSSLSocketFactory(sslsf); 
    } 
    catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) { 
     throw new IllegalStateException(e); 
    } 
} 
Questions connexes