Java (JDK1.8) не устанавливает расширение имени_сервера в SSL-квитировании, когда имя хоста имеет '_' - PullRequest
0 голосов
/ 31 января 2020
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet(url);
System.out.println(httpclient.execute(httpget));

Я использую этот программный фрагмент и использую его с парой URL. «https://abc.def.com/file.txt» и «https://ab_c.def.com / file.txt » (реальные имена, которые я использовал, существуют - это только пример). Когда я запускаю код с -Djavax. net .debug = ssl: handshake: набор параметров данных, я вижу, что расширение _ имя_сервера _ добавляется только в случае ab c .def.com и не в случае ab_ c .def.com.

Я знаю, что пакет java. net .URL не допускает '_' в имени хоста. Это похожая проблема? Есть ли способ обойти рукопожатие SSL, включив имя хоста с '_'?

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Ответ - нет. Это не будет работать в java с использованием стандартных библиотек JDK с HTTPS.

Практически нет "нормального" Java способа обойти эту проблему. Другие идеи:

  • попросить владельца службы предоставить доменное имя без _.
  • не использовать SSL / HTTPS. Большинство Java клиентов HTTP, которые не выполняют строгих проверок, будут работать с именем хоста с подчеркиванием. Это не очень удачное решение, если вы используете открытое целое rnet
  • и используете HTTPS, но go прямо на IP-адрес и отключаете проверку имени хоста HTTPS. Это также плохая идея, если вы находитесь в открытом пространстве rnet
  • , представив MITM или прямой прокси-сервер, который может предоставить конечную точку HTTP для вашей службы, но будет выполнять HTTPS в ненадежных частях сети, (SSL onloading?)
  • просто раскошелиться на curl и прочитать полученную строку, как описано здесь, на Baeldung . Будьте здесь очень осторожны, так как очень легко невольно открывать себе проблемы безопасности, такие как удаленное выполнение кода
  • использовать jni для доступа к сетевой библиотеке, которая позволит подчеркнуть - libcurl - очевидный кандидат, но это будет значительно более трудоемким, чем метод System.execute, также возможно небезопасный по другим причинам (управление памятью, нестабильность плохо написанного взаимодействия jni, не очень хорошо для удобства поддержки)
  • Возможно, вы могли бы попытаться форкнуть связанный URI / Классы парсинга URL в java.net, чтобы убрать проверку на подчеркивание. Проблема в том, что это массивный хак, возможно, неограниченной сложности, который может легко непреднамеренно сломать все, и вам может понадобиться создать собственную версию JDK, поскольку у меня есть некоторые воспоминания о коде java.net, который по какой-то причине особенный в том, что вы не могли просто забросить пропатченный класс в ext / lib dir JVM (но я мог бы смешать это с чем-то другим).
0 голосов
/ 10 февраля 2020

Я предоставлю исправление.

В файле / etc / hosts добавьте новую запись без подчеркивания IP.

Например,

ab c .com xx.xx.xx.xx

Затем используйте ab c .com в вашей программе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...