SSL ignorieren

krgewb

Top Contributor
Wir verwenden Spring Boot 2.5.1, Spring 5.3.9 und Java JDK 11.0.13.

Bei uns wird eine javax.net.ssl.SSLPeerUnverifiedException gefangen, wenn ein Bild von einer Webseite kopiert werden soll, die nur über HTTPS erreichbar ist. Wir würden gerne machen, dass es das einfach ignorieren soll und das Bild herunterladen soll. Wir dachten, dass wir das bereits getan haben. Das ist unsere AppConfig-Klasse:

Java:
@Configuration
public class AppConfig {

    @Bean
    @Primary
    public RestTemplate restTemplate(final RestTemplateBuilder restTemplateBuilder) {

        try {
            return AppConfig.turnOffSslChecking(restTemplateBuilder);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        } catch (KeyStoreException e) {
            e.printStackTrace();
        }

        return restTemplateBuilder
                .setConnectTimeout(Duration.ofMillis(60000))
                .setReadTimeout(Duration.ofMillis(60000))
                .build();
    }

    /**
     * @param restTemplateBuilder
     * @throws NoSuchAlgorithmException
     * @throws KeyManagementException
     */
    private static RestTemplate turnOffSslChecking(RestTemplateBuilder restTemplateBuilder) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException {
        TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;

        SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom()
                .loadTrustMaterial(null, acceptingTrustStrategy)
                .build();

        SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);

        CloseableHttpClient httpClient = HttpClients.custom()
                .setSSLSocketFactory(csf)
                .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
                .build();

        HttpComponentsClientHttpRequestFactory requestFactory =
                new HttpComponentsClientHttpRequestFactory();

        requestFactory.setHttpClient(httpClient);

        RestTemplate restTemplate = restTemplateBuilder
                .requestFactory(() -> requestFactory)
                .setConnectTimeout(Duration.ofMillis(60000))
                .setReadTimeout(Duration.ofMillis(60000))
                .defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
                .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .defaultHeader(HttpHeaders.ACCEPT_CHARSET, "UTF-8")
                .defaultMessageConverters()
                .build();

        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        converter.setSupportedMediaTypes(Collections.singletonList(MediaType.ALL));
        List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
        messageConverters.add(new ByteArrayHttpMessageConverter());
        messageConverters.add(new StringHttpMessageConverter());
        messageConverters.add(converter);
        restTemplate.setMessageConverters(messageConverters);

        return restTemplate;
    }

}
 

Robert Zenz

Top Contributor
Java:
                .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)

Wenn ich mich richtig erinnere, funktioniert das nur wenn man die Umgebungsvariable jdk.internal.httpclient.disableHostnameVerification auf true setzt bevor man irgendwas mit dem SSL-Stapel macht (also am besten vor dem Starten vom Prozess oder als erstes im main). Habt ihr das?
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben