HttpClient med SSL

1. Oversikt

Denne artikkelen vil vise hvordan du gjør det konfigurer Apache HttpClient 4 med “Accept All” SSL-støtte. Målet er enkelt - bruk HTTPS-URL-er som ikke har gyldige sertifikater.

Hvis du vil grave dypere og lære andre kule ting du kan gjøre med HttpClient - gå videre til den viktigste HttpClient-guiden.

2. Den SSLPeerUnverifiedException

Uten å konfigurere SSL med HttpClient, vil følgende test - forbruker en HTTPS URL - mislykkes:

offentlig klasse RestClientLiveManualTest {@Test (forventet = SSLPeerUnverifiedException.class) offentlig ugyldig nårHttpsUrlIsConsumed_thenException () kaster ClientProtocolException, IOException {CloseableHttpClient httpClient = HttpClients.createDefault; String urlOverHttps = "// localhost: 8082 / httpclient-simple"; HttpGet getMethod = ny HttpGet (urlOverHttps); HttpResponse respons = httpClient.execute (getMethod); assertThat (respons.getStatusLine (). getStatusCode (), equalTo (200)); }}

Den eksakte feilen er:

javax.net.ssl.SSLPeerUnverifiedException: peer ikke autentisert på sun.security.ssl.SSLSessionImpl.getPeerCertificates (SSLSessionImpl.java:397) på org.apache.http.conn.ssl.AbstractVerifier.verify (AbstractVerifier.java12 ..

De javax.net.ssl.SSLPeerUnverifiedException unntak oppstår når en gyldig kjede av tillit ikke kunne opprettes for URL-en.

3. Konfigurer SSL - Godta alle (HttpClient <4.3)

La oss nå konfigurere HTTP-klienten til å stole på alle sertifikatkjeder uavhengig av gyldighet:

@Test offentlig endelig ugyldighet givenAcceptingAllCertificates_whenHttpsUrlIsConsumed_thenOk () kaster GeneralSecurityException {HttpComponentsClientHttpRequestFactory requestFactory = ny HttpComponentsClientHttpRequestFactory (); CloseableHttpClient httpClient = (CloseableHttpClient) requestFactory.getHttpClient (); TrustStrategy acceptingTrustStrategy = (cert, authType) -> true; SSLSocketFactory sf = ny SSLSocketFactory (acceptingTrustStrategy, ALLOW_ALL_HOSTNAME_VERIFIER); httpClient.getConnectionManager (). getSchemeRegistry (). register (ny ordning ("https", 8443, sf)); ResponseEntity respons = ny RestTemplate (requestFactory). exchange (urlOverHttps, HttpMethod.GET, null, String.class); assertThat (respons.getStatusCode (). verdi (), equalTo (200)); }

Med det nye TrustStrategyoverstyre standard sertifikatverifiseringsprosess (som bør konsultere en konfigurert tillitsleder) - testen går nå og klienten er i stand til å konsumere HTTPS URL.

4. Konfigurer SSL - Godta alle (HttpClient 4.4 og over)

Med den nye HTTPClient har vi nå en forbedret, redesignet standard vertsverifiser for SSL-vertsnavn. Også med introduksjonen av SSLConnectionSocketFactory og RegistryBuilder, det er enkelt å bygge SSLSocketFactory. Så vi kan skrive testen ovenfor:

@Test offentlig endelig ugyldighet givenAcceptingAllCertificates_whenHttpsUrlIsConsumed_thenOk () kaster GeneralSecurityException {TrustStrategy acceptingTrustStrategy = (cert, authType) -> true; SSLContext sslContext = SSLContexts.custom (). LoadTrustMaterial (null, acceptingTrustStrategy) .build (); SSLConnectionSocketFactory sslsf = ny SSLConnectionSocketFactory (sslContext, NoopHostnameVerifier.INSTANCE); Registry socketFactoryRegistry = RegistryBuilder. opprett () .register ("https", sslsf) .register ("http", ny PlainConnectionSocketFactory ()) .build (); BasicHttpClientConnectionManager connectionManager = ny BasicHttpClientConnectionManager (socketFactoryRegistry); CloseableHttpClient httpClient = HttpClients.custom (). SetSSLSocketFactory (sslsf) .setConnectionManager (connectionManager) .build (); HttpComponentsClientHttpRequestFactory requestFactory = ny HttpComponentsClientHttpRequestFactory (httpClient); ResponseEntity response = new RestTemplate (requestFactory) .exchange (urlOverHttps, HttpMethod.GET, null, String.class); assertThat (respons.getStatusCode (). verdi (), equalTo (200)); }

5. Våren RestTemplate med SSL (HttpClient <4.3)

Nå som vi har sett hvordan du konfigurerer en råvare HttpClient med SSL-støtte, la oss ta en titt på en høyere klient - våren RestTemplate.

Uten SSL konfigurert mislykkes følgende test som forventet:

@Test (forventet = ResourceAccessException.class) offentlig ugyldig nårHttpsUrlIsConsumed_thenException () {String urlOverHttps = "// localhost: 8443 / httpclient-simple / api / bars / 1"; ResponseEntity respons = ny RestTemplate (). Utveksling (urlOverHttps, HttpMethod.GET, null, String.class); assertThat (respons.getStatusCode (). verdi (), equalTo (200)); }

Så la oss konfigurere SSL:

@Test offentlig ugyldig givenAcceptingAllCertificates_whenHttpsUrlIsConsumed_thenException () kaster GeneralSecurityException {HttpComponentsClientHttpRequestFactory requestFactory = ny HttpComponentsClientHttpRequestFactory (); DefaultHttpClient httpClient = (DefaultHttpClient) requestFactory.getHttpClient (); TrustStrategy acceptingTrustStrategy = (cert, authType) -> true SSLSocketFactory sf = new SSLSocketFactory (acceptingTrustStrategy, ALLOW_ALL_HOSTNAME_VERIFIER); httpClient.getConnectionManager (). getSchemeRegistry () .register (ny ordning ("https", 8443, sf)); String urlOverHttps = "// localhost: 8443 / httpclient-simple / api / bars / 1"; ResponseEntity respons = ny RestTemplate (requestFactory). exchange (urlOverHttps, HttpMethod.GET, null, String.class); assertThat (respons.getStatusCode (). verdi (), equalTo (200)); }

Som du kan se, er dette veldig lik måten vi konfigurerte SSL for den rå HttpClient - vi konfigurerer forespørselfabrikken med SSL-støtte, og deretter installerer vi malen som passerer denne forhåndskonfigurerte fabrikken.

6. Våren RestTemplate med SSL (HttpClient 4.4)

Og vi kan bruke samme måte å konfigurere vår RestTemplate:

@Test offentlig ugyldig givenAcceptingAllCertificatesUsing4_4_whenUsingRestTemplate_thenCorrect () kaster ClientProtocolException, IOException {CloseableHttpClient httpClient = HttpClients.custom () .setSSLHostnameVerifier (new NoopHost). HttpComponentsClientHttpRequestFactory requestFactory = ny HttpComponentsClientHttpRequestFactory (); requestFactory.setHttpClient (httpClient); ResponseEntity response = new RestTemplate (requestFactory) .exchange (urlOverHttps, HttpMethod.GET, null, String.class); assertThat (respons.getStatusCode (). verdi (), equalTo (200)); }

7. Konklusjon

Denne opplæringen diskuterte hvordan du konfigurerer SSL for en Apache HttpClient slik at den er i stand til å konsumere hvilken som helst HTTPS URL, uavhengig av sertifikatet. Den samme konfigurasjonen for våren RestTemplate er også illustrert.

En viktig ting å forstå er imidlertid at denne strategien ignorerer sertifikatkontroll - som gjør det usikkert og bare brukes der det gir mening.

Implementeringen av disse eksemplene finnes i GitHub-prosjektet - dette er et Eclipse-basert prosjekt, så det skal være enkelt å importere og kjøre som det er.


$config[zx-auto] not found$config[zx-overlay] not found