HttpClient SSL-lel

1. Áttekintés

Ez a cikk megmutatja, hogyan kell konfigurálja az Apache HttpClient 4 alkalmazást az „Accept All” SSL támogatással. A cél egyszerű - használjon HTTPS URL-eket, amelyek nem rendelkeznek érvényes tanúsítvánnyal.

Ha mélyebbre akarsz ásni, és további jó dolgokat akarsz megtudni, amit a HttpClient-nel tehetsz - menj tovább a fő HttpClient útmutató.

2. A SSLPeerUnverifiedException

Az SSL beállítása nélkül a HttpClient, a következő teszt - amely HTTPS URL-t igényel - sikertelen lesz:

public class RestClientLiveManualTest {@Test (várható = SSLPeerUnverifiedException.class) public void, amikorHHttpsUrlIsConsumed_thenException () dobja a ClientProtocolException, IOException {CloseableHttpClient httpClient = HttpteCtt String urlOverHttps = "// localhost: 8082 / httpclient-simple"; HttpGet getMethod = új HttpGet (urlOverHttps); HttpResponse response = httpClient.execute (getMethod); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }}

A pontos hiba:

javax.net.ssl.SSLPeerUnverifiedException: a peer nincs hitelesítve a sun.security.ssl.SSLSessionImpl.getPeerCertificates (SSLSessionImpl.java:397) címen: org.apache.http.conn.ssl.AbstractVerifier.verify (AbstractVerifier.ja) ..

A javax.net.ssl.SSLPeerUnverifiedException kivétel akkor fordul elő, amikor az URL-hez nem lehet érvényes bizalmi láncot létrehozni.

3. Konfigurálja az SSL-t - az összes elfogadása (HttpClient <4.3)

Konfiguráljuk most a HTTP klienst úgy, hogy az összes tanúsítványlánc megbízható legyen, függetlenül azok érvényességétől:

@Test public final void givenAcceptingAllCertificates_whenHttpsUrlIsConsumed_thenOk () throws GeneralSecurityException {HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory () CloseableHttpClient httpClient = (CloseableHttpClient) requestFactory.getHttpClient (); TrustStrategy acceptingTrustStrategy = (cert, authType) -> igaz; SSLSocketFactory sf = új SSLSocketFactory (elfogadóTrustStrategy, ALLOW_ALL_HOSTNAME_VERIFIER); httpClient.getConnectionManager (). getSchemeRegistry (). register (új rendszer ("https", 8443, sf)); ResponseEntity response = új RestTemplate (requestFactory). csere (urlOverHttps, HttpMethod.GET, null, String.class); assertThat (response.getStatusCode (). érték (), equalTo (200)); }

Az újval TrustStrategy Most felülírva a szabványos tanúsítványellenőrzési folyamatot (amelynek konzultálnia kell egy beállított megbízhatóságkezelővel) - a teszt mostantól sikeres és az ügyfél el tudja fogyasztani a HTTPS URL-t.

4. SSL konfigurálása - Minden elfogadása (HttpClient 4.4 és újabb)

Az új HTTPClient használatával most továbbfejlesztett, újratervezett alapértelmezett SSL gazdagép-hitelesítővel rendelkezünk. Bevezetésével is SSLConnectionSocketFactory és RegistryBuilder, könnyen felépíthető az SSLSocketFactory. Tehát megírhatjuk a fenti tesztesetet:

@Test public final void givenAcceptingAllCertificates_whenHttpsUrlIsConsumed_thenOk () throws GeneralSecurityException {TrustStrategy acceptingTrustStrategy = (cert, authType) -> true; SSLContext sslContext = SSLContexts.custom (). LoadTrustMaterial (null, elfogadóTrustStrategy) .build (); SSLConnectionSocketFactory sslsf = új SSLConnectionSocketFactory (sslContext, NoopHostnameVerifier.INSTANCE); Registry socketFactoryRegistry = RegistryBuilder. create () .register ("https", sslsf) .register ("http", új PlainConnectionSocketFactory ()) .build (); BasicHttpClientConnectionManager connectionManager = új BasicHttpClientConnectionManager (socketFactoryRegistry); CloseableHttpClient httpClient = HttpClients.custom (). SetSSLSocketFactory (sslsf) .setConnectionManager (connectionManager) .build (); HttpComponentsClientHttpRequestFactory requestFactory = új HttpComponentsClientHttpRequestFactory (httpClient); ResponseEntity response = új RestTemplate (requestFactory) .exchange (urlOverHttps, HttpMethod.GET, null, String.class); assertThat (response.getStatusCode (). érték (), equalTo (200)); }

5. A tavasz RestTemplate SSL-lel (HttpClient <4.3)

Most, hogy láttuk, hogyan kell konfigurálni a raw-t HttpClient SSL támogatással vessünk egy pillantást egy magasabb szintű kliensre - a Springre RestTemplate.

Ha nincs konfigurálva SSL, a következő teszt a várt módon sikertelen lesz:

@Test (várható = ResourceAccessException.class) public void whenHttpsUrlIsConsumed_thenException () {String urlOverHttps = "// localhost: 8443 / httpclient-simple / api / bars / 1"; ResponseEntity response = new RestTemplate (). Exchange (urlOverHttps, HttpMethod.GET, null, String.class); assertThat (response.getStatusCode (). érték (), equalTo (200)); }

Konfiguráljuk tehát az SSL-t:

@Test public void givenAcceptingAllCertificates_whenHttpsUrlIsConsumed_thenException () dobja a GeneralSecurityException {HttpComponentsClientHttpRequestFactory requestFactory = új HttpComponentsClientHttpRequestFactory ( DefaultHttpClient httpClient = (DefaultHttpClient) requestFactory.getHttpClient (); TrustStrategy acceptingTrustStrategy = (cert, authType) -> true SSLSocketFactory sf = új SSLSocketFactory (acceptTrustStrategy, ALLOW_ALL_HOSTNAME_VERIFIER); httpClient.getConnectionManager (). getSchemeRegistry () .register (új rendszer ("https", 8443, sf)); String urlOverHttps = "// localhost: 8443 / httpclient-simple / api / bars / 1"; ResponseEntity response = új RestTemplate (requestFactory). csere (urlOverHttps, HttpMethod.GET, null, String.class); assertThat (response.getStatusCode (). érték (), equalTo (200)); }

Mint láthatja, ez az nagyon hasonló ahhoz, ahogyan konfiguráltuk az SSL-t a nyers HttpClient számára - konfiguráljuk a kérelem gyárat SSL támogatással, majd példányosítjuk a sablont, amely átmegy ezen az előre beállított gyáron.

6. A tavasz RestTemplate SSL-lel (HttpClient 4.4)

És ugyanúgy használhatjuk a konfigurálást is RestTemplate:

@Test public void givenAcceptingAllCertificatesUsing4_4_whenUsingRestTemplate_thenCorrect () dobja a ClientProtocolException, IOException {CloseableHttpClient httpClient = HttpClients.custom () .setSSLHostnameVerifier (new NoopHostbuVerifier (new NoopHost) HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory (); requestFactory.setHttpClient (httpClient); ResponseEntity response = új RestTemplate (requestFactory) .exchange (urlOverHttps, HttpMethod.GET, null, String.class); assertThat (response.getStatusCode (). érték (), equalTo (200)); }

7. Következtetés

Ez az oktatóanyag megvitatta, hogyan kell konfigurálni az SSL-t egy Apache HttpClienthez úgy, hogy az bármilyen tanúsítástól függetlenül HTTPS URL-t fogyaszthasson. Ugyanez a konfiguráció a tavaszhoz RestTemplate is szemlélteti.

Fontos dolog azonban megérteni, hogy ez a stratégia teljes mértékben figyelmen kívül hagyja a tanúsítványellenőrzést - ami elbizonytalanítja, és csak ott használható, ahol ennek van értelme.

Ezeknek a példáknak a megvalósítása megtalálható a GitHub projektben - ez egy Eclipse alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.