Как я могу получить доменное имя запроса перед использованием SSLEngine?

Я хочу получить доменное имя в Java, прежде чем определить, какой сертификат я буду использовать для отправки обратно. Как я могу этого достичь?

Нужно ли мне как-то анализировать байты? или для этого есть библиотека? или может какая-нибудь библиотека Java Java сделать это?

Связанный пост Извлечь индикацию имени сервера (SNI) из клиента TLS привет

но я надеюсь просто использовать библиотеку Java для получения имени хоста.

2 ответа

Решение

Вам не нужно это перед использованием SSLEngine. Вам нужно это в вашем обычае KeyManager реализация, в chooseServerAlias() метод. Вам нужно будет найти доменное имя с помощью одного из методов, перечисленных ниже, а затем создать свой X509KeyManager реализация, настроенная соответствующим образом, чтобы вернуть соответствующий псевдоним хранилища ключей, а затем создать SSLContext, инициализировать его с вашим KeyManager, а затем построить свой SSLEngine. Во время рукопожатия двигатель позвонит вашему менеджеру ключей.

  1. SNI. Если клиент поддерживает SNI, вы можете получить доменное имя из начальной ClientHello сообщение, как показано в вашей ссылке. Вам нужно будет восстановить ByteBuffer до его первоначального состояния после анализа, так что SSLEngine Можно также разобрать это.

  2. В противном случае вы полагаетесь на то, что IP-адреса каждого домена различны. Вы должны уже иметь SocketChannel, Таким образом, вы уже знаете целевой адрес соединения, то есть адрес, который клиент использовал для подключения к вам, поэтому все, что вы можете сделать, это сопоставить имя домена с этим, если ваши домены имеют разные IP-адреса.

Совершенно необъяснимо, это невозможно сделать напрямую с SSLEngine.

Я столкнулся с той же самой проблемой и закончил тем, что написал библиотеку ( Канал TLS). Это не только то, что на самом деле это полная абстракция для SSLEngine, представленная как ByteChannel. Что касается SNI, на канал сервера может быть предоставлена ​​функция выбора SSLContexts в зависимости от предоставленного доменного имени.

Другие вопросы по тегам