Как я могу получить доменное имя запроса перед использованием SSLEngine?
Я хочу получить доменное имя в Java, прежде чем определить, какой сертификат я буду использовать для отправки обратно. Как я могу этого достичь?
Нужно ли мне как-то анализировать байты? или для этого есть библиотека? или может какая-нибудь библиотека Java Java сделать это?
Связанный пост Извлечь индикацию имени сервера (SNI) из клиента TLS привет
но я надеюсь просто использовать библиотеку Java для получения имени хоста.
2 ответа
Вам не нужно это перед использованием SSLEngine.
Вам нужно это в вашем обычае KeyManager
реализация, в chooseServerAlias()
метод. Вам нужно будет найти доменное имя с помощью одного из методов, перечисленных ниже, а затем создать свой X509KeyManager
реализация, настроенная соответствующим образом, чтобы вернуть соответствующий псевдоним хранилища ключей, а затем создать SSLContext,
инициализировать его с вашим KeyManager
, а затем построить свой SSLEngine.
Во время рукопожатия двигатель позвонит вашему менеджеру ключей.
SNI. Если клиент поддерживает SNI, вы можете получить доменное имя из начальной
ClientHello
сообщение, как показано в вашей ссылке. Вам нужно будет восстановитьByteBuffer
до его первоначального состояния после анализа, так чтоSSLEngine
Можно также разобрать это.В противном случае вы полагаетесь на то, что IP-адреса каждого домена различны. Вы должны уже иметь
SocketChannel,
Таким образом, вы уже знаете целевой адрес соединения, то есть адрес, который клиент использовал для подключения к вам, поэтому все, что вы можете сделать, это сопоставить имя домена с этим, если ваши домены имеют разные IP-адреса.
Совершенно необъяснимо, это невозможно сделать напрямую с SSLEngine.
Я столкнулся с той же самой проблемой и закончил тем, что написал библиотеку ( Канал TLS). Это не только то, что на самом деле это полная абстракция для SSLEngine, представленная как ByteChannel. Что касается SNI, на канал сервера может быть предоставлена функция выбора SSLContexts в зависимости от предоставленного доменного имени.