Java 11 SSLHandshakeException с TLS 1.3: как вернуться к TLS 1.2? - PullRequest
3 голосов
/ 31 марта 2020

Мое приложение - это форма "веб-скребка", которая загружает HTML с нужной страницы ввода, используя библиотеку Java Jsoup . Недавно я обновил платформу своего приложения с Java 8 до Java 11. С этим обновлением я получил несколько отчетов от моих клиентов, в которых говорилось, что они получают исключения SSLHandshakeException при попытке загрузить содержимое HTML определенных веб-страниц. Веб-страницы, на которых они появляются, варьируются от устройства к устройству, и на некоторых устройствах мои клиенты вообще не могут загружать веб-страницы (ни http: //, ни https: // веб-страницы).

Я имею попытался решить эту проблему несколькими способами, но безрезультатно:

  1. Замена файла CACERT среды выполнения Java 11 файлом CACERT среды выполнения Java 8
  2. Создание собственного получателя сертификата SSL который принимает все сертификаты SSL независимо от действительности (я знаю, что это плохо для производственного кода, но это было только для целей тестирования) - см. Доверие всем сертификатам с использованием HttpClient через HTTPS

В На данный момент я не совсем уверен, какие варианты выбрать, так как у меня ограниченные знания SSL, TLS и HTTPS. Эти ошибки никогда не возникали в Java 8, и все, что раньше работало нормально до обновления до Java 11.

Насколько я понимаю, единственное, что Java 11 изменилось в SSL, это обновление до TLS 1.3 в то время как предыдущая версия Java использовала TLS 1.2.

Следовательно, я хотел бы заставить Java 11 использовать TLS 1.2, а не TLS 1.3, поскольку я считаю, что это является причиной исключений SSLHandshakeException. Как мне go сделать это?

1 Ответ

2 голосов
/ 31 марта 2020

Neardupe Java 11 HTTPS-соединение завершается неудачно с SSL HandshakeException при использовании Jsoup , но у меня есть кое-что добавить.

Использование Connection.sslSocketFactory (factory) с подходящий аргумент. Предполагая, что стандартные / стандартные провайдеры, вы можете использовать фабрику, созданную из SSLContext.getInstance("TLSv1.2"), вероятно, с использованием по умолчанию TrustManager и KeyManager, то есть .init(null,null,null).

Или установить jdk.tls.client.protocols или https.protocols для таблицы 8-3 в документации JSSE . Обратите внимание, что это может повлиять на любые другие соединения SSL / TLS или другие URLConnection для HTTPS, сделанные из той же JVM.

Я был бы удивлен, если это решит вашу проблему, хотя. TLS1.3 был отложен лет частично из-за хаков, которые они добавили, поэтому он не не работает с устаревшими 1.2 (и даже более ранними) системами и «блоками».

...