Мы часто сталкиваемся с проблемой сертификата при использовании шаблона Rest.
RestTemplate может выдать любую из приведенных ниже ошибок, если SSL-сертификат целевого хоста недействителен:
Не удалось построить путь PKIX: Не удалось построить путь PKIX:
Не удалось построить путь PKIX: путь sun.security.provider.certpath.Исключение SunCertPathBuilderException: не удается найти допустимый путь сертификации к запрошенной цели javax.net.ssl. Исключение SSLHandshakeException: не удалось построить путь PKIX
Причин недействительного SSL-сертификата может быть множество, в том числе:
- Сертификат с истекшим сроком действия
- Самозаверяющий сертификат
- Неверная информация о хосте в сертификатах
- Отозванный сертификат
- Ненадежный корень сертификата
Как мы справляемся с этим в производственной и непроизводственной среде?
В среде production мы обычно добавляем необходимые сертификаты в хранилище ключей нашего приложения, что позволяет нам успешно выполнить запрос HTTPS.
В непроизводственных средах при разработке приложения нам часто приходится отключать проверку ssl-сертификата (самоподписанный, с истекшим сроком действия, ненадежный root и т. Д.) поскольку мы не хотим испытывать трудности с созданием соответствующих сертификатов и управлением хранилищем ключей для целей тестирования.
Итак, мы настраиваем RestTemplate , чтобы отключить проверку SSL (среда, не связанная с prod), и, таким образом, доверяем всем видам сертификатов, независимо от того, действительны они или нет в Spring Boot RestTemplate, и разрешаем http-запросы к хостам без исключения.
public RestTemplate restTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { 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) .build(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); requestFactory.setHttpClient(httpClient); RestTemplate restTemplate = new RestTemplate(requestFactory); return restTemplate; }
Примечание: Избегайте проверки SSL для RestTemplate только для среды разработки.
В производственной среде мы должны выполнять управление сертификатами и проверку SSL, так как отключение проверки SSL может привести к угрозам безопасности.
Оригинал: “https://dev.to/mnpaa/disable-skip-ssl-validation-in-springboot-resttemplate-1ec2”