Как заставить Apache Commons HttpClient 3.1 игнорировать недействительность сертификата HTTPS? - PullRequest
7 голосов
/ 07 октября 2011

Я пытаюсь заставить библиотеку Apache Commons HttpClient (версия 3.1) игнорировать тот факт, что сертификат сервера не может быть установлен как доверенный (о чем свидетельствует выброшенное исключение javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target).

Я сделалfind Установите соединение с сервером HTTPS из Java и проигнорируйте действительность сертификата безопасности , а также Отключите проверку сертификата в Java-соединениях SSL , но принятый ответ для первогоHttpClient 4.0 (к сожалению, я не могу обновить, , если кто-то не может указать мне, как использовать две разные версии одной и той же библиотеки в одном проекте), хотя у него есть другой ответ с небольшимбольше, чем мертвая ссылка, которая предположительно пошла на решение 3.x .Код на второй странице, кажется, не имеет никакого эффекта, когда я использую его слегка скорректированную версию (в основном, объявление классов старым способом, а не использование анонимных встроенных, а также применение к TLS в дополнение кSSL, с использованием SSL для фабрики сокетов HTTPS по умолчанию, как это сделано в примере кода).

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

Да, я знаю, что есть последствия для безопасности, но единственная причина, по которой мне это вообще нужно, этоцели тестирования.Идея состоит в том, чтобы реализовать параметр конфигурации, который контролирует, являются ли обычно ненадежные сертификаты доверенными или нет, и оставить его по умолчанию «не доверять ненадежным сертификатам сервера».Таким образом, его можно легко включить или отключить в процессе разработки, но выполнение этого в процессе производства потребует усилий.

1 Ответ

11 голосов
/ 07 октября 2011

Чтобы принять подписанные сертификаты, мы используем следующий код для конкретного HttpConnection от клиента http commons.

HttpConnection con = new HttpConnection(host, port);
con.setProtocol(new Protocol("easyhttps", (ProtocolSocketFactory)new EasySSLProtocolSocketFactory(), port));

EasySSLProtocolSocketFactory можно найти в пакете contrib ssl. И это может быть использовано для создания только отдельных соединений с пониженной настройкой безопасности. Похоже, это также можно использовать для установки протокола для каждого клиента, как показано здесь:

Protocol easyhttps = new Protocol("https", (ProtocolSocketFactory)new EasySSLProtocolSocketFactory(), 443);
Protocol.registerProtocol("https", easyhttps);

HttpClient client = new HttpClient();
GetMethod httpget = new GetMethod("https://localhost/");
client.executeMethod(httpget);

Но я думаю, что это также повлияет на соединения с другими сервлетами.

[Изменить] Извините, я не знаю, сработает ли это для вас. Просто признал, что мы используем клиент 3.0.1, а не 3.1.

...