Как игнорировать сертификат SSL (доверять всем) для Apache HttpClient 4.3 ?
Все ответы, которые я нашел в SO, относятся к предыдущим версиям, а API изменился.
Связанный:
- Как игнорировать ошибки сертификата SSL в Apache HttpClient 4.0
- Как обрабатывать недействительные сертификаты SSL с помощью Apache HttpClient?
- Необходимо доверять всем сертификатам при разработке с использованием Spring
- Игнорировать ошибки сертификата SSL с помощью Java
Редактировать:
- Это только для тестовых целей. Дети, не пробуйте дома (или на производстве)
java
ssl
apache-httpcomponents
Якуб М.
источник
источник
SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
SSLContextBuilder
Idea находит несколько вызываемых классов .Если вы используете PoolingHttpClientConnectionManager, процедура выше не работает, настраиваемый SSLContext игнорируется. Вы должны передать socketFactoryRegistry в конструктор при создании PoolingHttpClientConnectionManager.
источник
HttpClients.custom().setConnectionManager(cm).build()
иHttpClients.custom().setSSLSocketFactory(connectionFactory).build()
будут работать, поэтому вам не нужно создаватьPoolingHttpClientConnectionManager
В дополнение к ответу @mavroprovato, если вы хотите доверять всем сертификатам, а не только самоподписанным, вы бы это сделали (в стиле вашего кода)
или (прямая копипаста из моего собственного кода):
И если вы также хотите пропустить проверку имени хоста, вам необходимо установить
также. (ALLOW_ALL_HOSTNAME_VERIFIER устарел).
Обязательное предупреждение: этого делать не стоит, принимать все сертификаты - плохо. Однако есть несколько редких случаев, когда вы хотите это сделать.
В качестве примечания к ранее приведенному коду вы захотите закрыть ответ, даже если httpclient.execute () выдает исключение.
Код выше был протестирован с использованием
А для интересующихся вот мой полный набор тестов:
(рабочий тестовый проект в github )
источник
Одно небольшое дополнение к ответу vasekt:
Предоставленное решение с SocketFactoryRegistry работает при использовании PoolingHttpClientConnectionManager.
Однако соединения через простой http перестают работать. Вы должны добавить PlainConnectionSocketFactory для протокола http, чтобы они снова работали:
источник
http
протокол используетсяPlainConnectionSocketFactory
по умолчанию. Я только зарегистрировался,https
иhttpclient
все еще могу получать простые URL-адреса HTTP. поэтому я не думаю, что этот шаг необходим.PoolingHttpClientConnectionManager
После опробования различных параметров следующая конфигурация работала как для http, так и для https:
Я использую http-клиент 4.3.3:
compile 'org.apache.httpcomponents:httpclient:4.3.3'
источник
Более простой и короткий рабочий код:
источник
Вот рабочая переработка вышеперечисленных методов, эквивалентная curl --insecure:
источник
При использовании http-клиента 4.5 мне пришлось использовать javasx.net.ssl.HostnameVerifier, чтобы разрешить любое имя хоста (в целях тестирования). Вот что я в итоге сделал:
источник
SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build(), hostnameVerifierAllowAll);
наSSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build(), (hostName, sslSession) -> true);
. Он избегает анонимного класса и делает код более читабельным.На вершине
PoolingHttpClientConnectionManager
вместе сRegistry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create().register("https", sslFactory).build();
Если вы хотите асинхронное HttpClient используяPoolingNHttpClientConnectionManager
код shoudl быть похож на следующееисточник
Если вы используете
HttpClient 4.5.x
, ваш код может быть похож на следующий:источник
источник
Доверяйте всем сертификатам в HTTP-клиенте Apache
источник
(Я бы добавил комментарий непосредственно к ответу vasekt, но у меня недостаточно очков репутации (не уверен, что там логика)
В любом случае ... я хотел сказать, что даже если вы явно не создаете / не запрашиваете PoolingConnection, это не значит, что вы его не получаете.
Я сходил с ума, пытаясь понять, почему исходное решение не сработало для меня, но я проигнорировал ответ vasekt, поскольку он «не относился к моему случаю» - неправильно!
Я смотрел на свою трассировку стека, когда она была низкой, и вот, я увидел PoolingConnection в ее середине. Бац - надоело его прибавление и успех !! (наша демонстрация завтра, и я уже отчаялся) :-)
источник
Вы можете использовать следующий фрагмент кода для получения экземпляра HttpClient без проверки сертификата ssl.
источник
Небольшая настройка ответа от @divbyzero выше, чтобы исправить предупреждения о безопасности сонара
источник
Изначально я мог отключить для localhost с помощью стратегии доверия, позже я добавил NoopHostnameVerifier. Теперь он будет работать как для localhost, так и для любого имени машины.
источник