2016-02-10 7 views
1

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

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

родственного сообщение Extract Server Name Indication (SNI) from TLS client hello

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

+0

Вам не нужно это, прежде чем использовать 'SSLEngine,' вам это нужно в ваших 'KeyManager.getServerAliases()/selectServerAlias ​​()' методах. – EJP

+0

@ EJP ok? поэтому какой метод я могу вызвать, когда получаю сообщение подтверждения? KeyManagerFactory.processClientHelloHandshake (byte [] data)? Я также не вижу никаких методов в KeyManager здесь ... https://docs.oracle.com/javase/7/docs/api/index.html?javax/net/ssl/KeyManager.html –

+0

Он будет вам звонить, а не наоборот. Двигатель вызовет методы, о которых я упоминал. – EJP

ответ

0

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

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

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

0

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

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