
Иногда, когда мы пытаемся подключиться к URL-адресу, вы можете получить ошибку SSLHandshakeException или IOException. Причиной этой ошибки является невозможность установить соединение с шифрованием SSL.
В Java, когда мы пытаемся открыть соединение SSL, реализация протокола SSL в JSSE выполняет некоторый процесс проверки, чтобы проверить, является ли запрошенный хост реальным или поддельным. Эта проверка включает проверку сертификата X.509 сервера.
В этой статье будет показано, как отключить проверку сертификата при создании HTTP-соединения. Кроме того, мы напишем пример кода с пояснениями по теме, чтобы его было легко понять.
Отключение или обход проверки сертификата SSL никогда не является рекомендуемым решением проблем SSL, но в тестовой среде — иногда это может вам понадобиться. В этом уроке я создаю экземпляры org.apache.http.impl.client. DefaultHttpClient доступен до версии библиотеки Apache HTTP 4.2 и org.apache.http.impl.client. CloseableHttpClient доступен начиная с версии HTTP-библиотеки Apache 4.3.
DefaultHttpClient теперь является устаревшим классом, поэтому предлагается использовать класс CloseableHttpClient. Не забывайте обходить проверку SSL только в целях отладки, когда мы хотим протестировать несколько защищенных API без настройки установки сертификата на локальном компьютере.
При работе с HTTP-клиентами в Java мы часто получаем исключение проверки сертификата, как показано ниже.
Вызвано: sun.security.validator. ValidatorException: не удалось построить путь PKIX: sun.security.provider.certpath. SunCertPathBuilderException: невозможно найти действительный путь сертификации для запрошенной цели
Вышеупомянутое исключение может быть вызвано самозаверяющим сертификатом или сертификатом с истекшим сроком действия, поскольку клиент не может проверить сертификаты. Это исключение также может возникать за корпоративными интернет-прокси.
Если кто-то хочет отключить это исключение в программах Java, то это можно сделать программно, создав собственную фабрику сокетов и, при необходимости, создав varifire имен хостов.
Если кто-то использует класс HttpsURLConnection, это отключит проверку сертификата, как указано ниже.
Итак, код:
Исключение в потоке «основной» java.io. IOException: сервер вернул код ответа HTTP: 401 для URL-адреса: https://www.nkov.com:2083/
на сайте sun.net.www.protocol.http. HttpURLConnection.getInputStream(HttpURLConnection.java:1615)
на сайте sun.net.www.protocol.https. HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
в МейнПроекте. Cert.main(Cert.java:56)
6 золотых знаков39 серебряных знаков54 бронзовых знака
спросил 28 октября 2012 в 1:43
ответил 28 окт. 2012 в 2:04
14 золотых знаков108 серебряных знаков175 бронзовых знаков
Это не решит проблему. Ошибка 401 была передана через HTTPS и SSL, поэтому сертификаты работают отлично.
В любом случае я настоятельно рекомендую вам этого не делать. Вы не хотите, чтобы при тестировании и производстве выполнялся разный код. Существует серьезный риск того, что тестовый код попадет в рабочую среду и поставит под угрозу безопасность. И нет смысла тестировать небезопасный код.
ответил 28 окт. 2012 в 2:29
44 золотых знака307 серебряных знаков483 бронзовых знака
Не беспокойтесь об отключении его в своем коде, вы можете просто добавить сертификат в хранилище доверенных сертификатов вашей тестовой машины и быть на 100% уверенным, что не отправите сборку с отключенной проверкой.
ответил 28 окт. 2012 в 1:57
4 золотых знака23 серебряных знака28 бронзовых знаков
Как упоминалось другими, ошибка 401 означает, что вы действительно установили SSL-соединение, отправили свой запрос и получили обратно эту ошибку 401. Итак, ваш SSL-код в порядке.
ответил 20 ноября 2012 в 10:41
4 золотых знака28 серебряных знаков49 бронзовых знаков
Я получил эту ошибку при попытке запустить приложение:
Sun.security.validator. ValidatorException: проверка пути PKIX не удалась:
java.security.cert. CertPathValidatorException: java.net. UnknownHostException:oscp.thawte.com
Приложение находится в закрытой сети и никогда не сможет получить доступ к oscp.thawte.com. Есть ли настройка Java, которая может отключить это?
спросил 11 янв. 2011 в 22:03
14 золотых знаков107 серебряных знаков142 бронзовых знака
ответил 11 янв. 2011 в 22:14
18 золотых знаков74 серебряных знака111 бронзовых знаков
Это не совсем настройка, но вы можете переопределить стандартные TrustManager и HostnameVerifier, чтобы принять что угодно. Небезопасный подход, но в вашей ситуации он может быть приемлемым.
ответил 11 янв. 2011 в 23:39
11 золотых знаков70 серебряных знаков85 бронзовых знаков
В дополнение к ответам выше. Вы можете сделать это программно, реализовав TrustManager:
Однако это не очень хорошая практика для производства.
Этот пример «Как отключить проверку сертификата SSL в Java» содержит служебный класс, который вы можете скопировать в свой проект.
ответил 25 янв. 2019 в 3:28
15 серебряных знаков23 бронзовых знака
Используйте утилиту cli keytool из дистрибутива программного обеспечения Java для импорта (и доверия!) необходимых сертификатов
случайно нашла такой простой совет.
Другие решения требуют использования InstallCert. Java и JDK
ответил 31 янв. 2018 в 13:00

31 золотой знак106 серебряных знаков135 бронзовых знаков
ответил 7 авг. 2018 в 22:57
В веб-сервисе Axis, если вам необходимо отключить проверку сертификатов, используйте приведенный ниже код:
20 золотых знаков113 серебряных знаков121 бронзовый знак
ответил 3 апреля 2014 в 8:19
Это очень просто. На мой взгляд, это лучший способ для всех
ответил 18 апр. 2020 в 17:46
Я хочу получить доступ к URL-адресу веб-службы SOAP, имеющему https, размещенному на удаленной виртуальной машине. Я получаю исключение при доступе к нему с помощью HttpURLConnection.
Вот мой код:
Пробовал разные решения из поиска в Google, ни одно из них не помогло. Я хочу избежать использования keytool, потому что я буду запускать тесты на разных виртуальных машинах.
Есть ли у кого-нибудь решение этой проблемы?
спросил 15 марта 2017 в 10:14
2 золотых знака14 серебряных знаков26 бронзовых знаков
Использование X509ExtendedTrustManager вместо X509TrustManager() решило проблему. Вот пример:
ответил 1 ноября 2017 в 8:30
Редактировать: осознайте уязвимость, которую это может вызвать, прежде чем использовать его. Это ни в коем случае не рекомендуется для промышленного использования.
Лучший способ — создать фиктивного траст-менеджера, который доверяет всему.
Затем используйте фиктивный диспетчер доверия для инициализации контекста SSL
SSLContext sc = SSLContext.getInstance(«SSL»);
sc.init(null, dummyTrustManager, новый java.security. SecureRandom());
Наконец, используйте SSLContext для открытия соединения
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
URL URL = новый URL(«https://myhost:8913/myservice/service?wsdl»);
Более подробно на этот вопрос здесь уже отвечали.
Java: функция переопределения для отключения проверки сертификата SSL
Вышеуказанная проблема связана с тем, что алгоритм подписи сертификата не поддерживается Java. Согласно этому сообщению, в более поздних выпусках Java 8 алгоритм md5 отключен.
jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024,
и удалите MD5
ответил 15 марта 2017 в 10:33
Попробуйте использовать HTTP-клиент Apache, у меня это работает.
ответил 15 марта 2017 в 10:32
1 золотой знак10 серебряных знаков20 бронзовых знаков
Вместо использования HttpsURLConnection.setDefaultSSLSocketFactory и собственной реализации TrustManager или X509ExtendedTrustManager вы можете использовать TrustManagerFactory с хранилищем ключей с сертификатом, выдавшим сертификат, которому вы должны доверять (для самозаверяющего сертификата это то же самое, что и сертификат узла) и вызовите HttpsURLConnection.setSSLSocketFactory в конкретном экземпляре. Это позволяет сократить количество кода и избежать проблем безопасности, связанных с доверием ко всем сертификатам HTTPS.
Метод createSSLSocketFactory выглядит следующим образом:
ответил 19 июля 2019 в 20:55
Другой способ при использовании httpClient из Apache:
И потом:
HttpPost post = new HttpPost(«ваш URI»);
Ответ CloseableHttpResponse = getCloseableHttpClient.execute(post);
ответил 9 авг в 10:41
Настройка шаблона Spring RestTemplate
Если вы неправильно настроили приведенный выше код, вы можете найти сообщение об исключении ниже. Это сообщение подтверждает, что сопоставление сертификатов SSL по-прежнему не удается.
javax.net.ssl. SSLHandshakeException: sun.security.validator. ValidatorException: не удалось построить путь PKIX: sun.security.provider.certpath. SunCertPathBuilderException: невозможно найти действительный путь сертификации для запрошенной цели
на sun.security.ssl. Alerts.getSSLException(Alerts.java:192)
на sun.security.ssl. SSLSocketImpl.fatal(SSLSocketImpl.java:1916)
на sun.security.ssl. Handshaker.fatalSE(Handshaker.java:279)
на sun.security.ssl. Handshaker.fatalSE(Handshaker.java:273)
на sun.security.ssl. ClientHandshaker.serverCertificate(ClientHandshaker.java:1472)
на sun.security.ssl. ClientHandshaker.processMessage(ClientHandshaker.java:213)
на sun.security.ssl. Handshaker.processLoop(Handshaker.java:913)
на sun.security.ssl. Handshaker.process_record(Handshaker.java:849)
на sun.security.ssl. SSLSocketImpl.readRecord(SSLSocketImpl.java:1035)
на sun.security.ssl. SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1344)
на sun.security.ssl. SSLSocketImpl.startHandshake(SSLSocketImpl.java:1371)
на sun.security.ssl. SSLSocketImpl.startHandshake(SSLSocketImpl.java:1355)
по адресу org.apache.http.conn.ssl. SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:394)
по адресу org.apache.http.conn.ssl. SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:353)
по адресу org.apache.http.impl.conn. DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:141)
по адресу org.apache.http.impl.conn. PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353)
по адресу org.apache.http.impl.execchain. MainClientExec.installRoute(MainClientExec.java:380)
по адресу org.apache.http.impl.execchain. MainClientExec.execute(MainClientExec.java:236)
по адресу org.apache.http.impl.execchain. ПротоколExec.execute(ProtocolExec.java:184)
по адресу org.apache.http.impl.execchain. RetryExec.execute(RetryExec.java:88)
по адресу org.apache.http.impl.execchain. RedirectExec.execute(RedirectExec.java:110)
на org.apache.http.impl.client. InternalHttpClient.doExecute(InternalHttpClient.java:184)
на org.apache.http.impl.client. CloseableHttpClient.execute(CloseableHttpClient.java:82)
на org.apache.http.impl.client. CloseableHttpClient.execute(CloseableHttpClient.java:107)
Задавайте мне свои вопросы в комментариях.
Приятного обучения!!
Java отключить проверку SSL
Прежде чем перейти к решению, давайте посмотрим на ошибку ниже, которую мы получаем при попытке подключения по URL-адресу:
Вызвано: javax.net.ssl. SSLHandshakeException: sun.security.validator. ValidatorException: не удалось построить путь PKIX: sun.security.provider.certpath. SunCertPathBuilderException: невозможно найти действительный путь сертификации для запрошенной цели
Отключить проверку хоста и сертификата
// импорт необходимых пакетов
// Наш основной класс
// Создание доверительного управляющего.
// Проверка не требуется
// Проверка не требуется
// Установка Trast-менеджера
SSLContext SSLCont SSLContext
SSLCont TrustMgr SecureRandom
// Создание вседоверяющего верификатора для имени хоста
// Установка вседоверяющего верификатора для HOST
URL MyURL URL // URL местоположения
URLConnection Connect MyURL // Открытие URL-соединения
Читатель MyReader InputStreamReaderconnect // Создание читателя
Чарс MyReader
Назначение каждой строки мы уже описали в комментариях. Однако если вы внимательно посмотрите на код, то обнаружите, что мы ничего не определили для checkClientTrusted и checkServerTrusted.
Таким образом мы обходим проверку. Таким образом, выполнение приведенного выше примера кода приведет к выводу на вашей консоли результата, подобного приведенному ниже.
Обход проверки SSL-сертификата с помощью DefaultHttpClient
Если вы работаете с более старыми версиями HTTP-библиотеки Apache, вам подойдет эта версия кода.
Чтобы использовать экземпляр DefaultHttpClient, используйте его следующим образом.
//Некоторый собственный метод для создания HTTP-объекта сообщения
Сообщение HttpPost = createPostRequest();
//Получаем http-клиент
Клиент DefaultHttpClient = getDefaultHttpClient();
//Выполняем HTTP-метод
HttpResponse httpResponse = client.execute(post);
//Обработка ответа
Еще раз: пожалуйста, не используйте его в производственной среде, поскольку это противоречит всей цели обеспечения безопасности SSL на первом месте.
Пример Java для отключения проверки сертификата HTTPS
HttpClient httpClient = HttpClients.custom()
.setSSLContext(новый SSLContextBuilder().loadTrustMaterial(null, TrustAllStrategy. INSTANCE).build())
.setSSLHostnameVerifier(NoopHostnameVerifier. INSTANCE)
.строить();
Затем создайте один SSLContext, используя этот объект TrustManager, и установите фабрику сокетов HttpsURLConnection из созданного объекта SSLContext.
При желании вы также можете отключить проверку хоста, используя класс HostnameVerifier, как указано ниже.
Обход проверки SSL-сертификата с помощью CloseableHttpClient
Если вы работаете с последними версиями HTTP-библиотеки Apache, вам подойдет эта версия кода.
Чтобы использовать экземпляр CloseableHttpClient, используйте его следующим образом.





