Подтвердить что ты не робот

Ошибка SSL "Peer Not Authenticated" с HttpClient 4.1

Я создаю простой монитор приложений, чтобы опросить один из наших URL-адресов API, и напишите нам, если он не может получить код состояния HTTP 200 из ответа (это может указывать на то, что по какой-то причине наш API не работает).

Я использую HttpClient 4.1 (это важно, потому что его API сильно отличается от 3.x).

Наш API защищен SSL, однако введите

http://example.com/our-api

в веб-браузер перенаправляет вас на

https://example.com/our-api

Без ошибок.

Когда HttpClient пытается ударить по этому URL-адресу (http://example.com/our-api), он не работает с исключением javax.net.ssl.SSLPeerUnverifiedException с сообщением:

не аутентифицирован

Я вижу, что это происходит для других людей, о чем свидетельствует этот пост (который также предоставляет некоторые способы обхода этой проблемы - решение, которое я собираюсь попробуйте и осуществите сегодня вечером).

То, что этот другой пост (и другие подобные ему) не делает, объясняет, почему это происходит в первую очередь! Поэтому, вместо того, чтобы спрашивать: "Как я могу это исправить?" Я полагал, что задал вопрос ", почему это происходит?" Прежде чем я начну предлагать одно из предлагаемых решений, я хотел бы знать, в чем проблема: я пытаюсь исправить; )

4b9b3361

Ответ 1

Если сертификат сервера самоподписан, то он работает как запроектированный, и вам придется импортировать сертификат сервера в хранилище ключей.

Предполагая, что сертификат сервера подписан известным CA, это происходит потому, что набор сертификатов CA, доступных для современного браузера, намного больше, чем ограниченный набор, поставляемый с JDK/JRE.

Решение EasySSL, приведенное в одном из сообщений, которые вы упомянули, просто искушает ошибку, и вы не узнаете, имеет ли сервер действительный сертификат.

Вы должны импортировать правильный корневой ЦС в хранилище ключей для проверки сертификата. Там есть причина, по которой вы не можете обойти это с помощью кода SSL на складе, и это не позволит вам писать программы, которые ведут себя так, как будто они безопасны, но не являются.

Ответ 2

Это бросается, когда

... сверстник не смог идентифицировать себя (например, no сертификат, используемый конкретный шифровой набор не поддерживает аутентификация или отсутствие одноранговой аутентификации во время SSL квитирование) это исключение выбрано.

Вероятно, причина этого исключения (где is stacktrace) покажет вам, почему это исключение выбрано. Скорее всего, хранилище ключей по умолчанию, поставляемое с Java, не содержит (и не доверяет) корневому сертификату используемого TTP.

Ответ заключается в том, чтобы получить корневой сертификат (например, из SSL-соединения браузеров), импортировать его в файл cacerts и доверять ему с помощью keytool, который отправляется Java JDK. В противном случае вам придется программно назначить другое хранилище доверия.

Ответ 3

Я не разработчик java, но использовал java-приложение для тестирования API RESTful. Чтобы исправить ошибку, мне пришлось установить промежуточные сертификаты на веб-сервере, чтобы ошибка исчезла. Я использовал lighttpd, оригинальный сертификат был установлен на сервере IIS. Надеюсь, поможет. Это были сертификаты, отсутствовавшие на сервере.

  • ca.crt
  • UTNAddTrustServer_CA.crt
  • AddTrustExternalCARoot.crt

Ответ 4

keytool -import -v -alias cacerts -keystore cacerts.jks -storepass changeit -file C:\cacerts.cer