SSL рукопожатие с Play несоответствие имен хостов

Мы используем Play 2.5 + Scala и нам нужно использовать SSL для подключения к удаленному клиенту через https.

Вопрос в том, что у сертификата, который мы получили от клиента, есть что-то вроде CN api.*.*.*.net

но фактический URL, на который мы пытаемся попасть, содержит IP-адрес: https://123.234.34.56/service/resource/operation...

Так как общее имя в сертификате и имя хоста (ipAddress) в URL не совпадают, мы видим следующую ошибку.

SSLHandshakeException: No subject alternative names present

Поэтому я попытался реализовать HostnameVerifier, как показано ниже в Scala, но этот код не выбирается Play или Netty.

 HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier()
        {
            public boolean verify(String hostname, SSLSession session)
            {
               // custom logic here to match hostname and IpAddress
                return true;
            }
        });

Я понятия не имею, почему Play/Netty не поднимает его во время выполнения, но мы запускаем удаленный клиент, используя Play WS:

import play.api.libs.ws.WS 
WS.url(url).get()...

Я также подумываю попробовать решение, упомянутое здесь: поддержка проверки имени хоста Netty SSL

но не уверен, что мне нужно реализовать ChannelFactory по приведенной выше ссылке, как показано здесь http://netty.io/3.10/xref/org/jboss/netty/example/securechat/SecureChatClientPipelineFactory.html

Также я видел где-то еще в SO сообщения, что:

Если имя хоста в сертификате не разрешается по адресу, сервер неправильно настроен. Тем не менее, вы должны иметь возможность изменить локальное разрешение DNS, указав это имя на этом IP-адресе в файле /etc/hosts (если это Linux или эквивалентный ему Windows).

Я понятия не имею, как достичь этого программно в Java/Scala

Любая помощь приветствуется!

Спасибо

Суреш

1 ответ

Исправление "hosts" выглядит так:

  1. Добавьте следующую строку в ваш hosts файл ( инструкция для Windows или Linux здесь)

    123.234.34.56 api.a.b.c.net
    
  2. Теперь подключитесь к серверу, используя имя хоста "api.abcnet", а не его IP-адрес

  3. Из-за hosts переопределить, ваш компьютер не будет выполнять поиск DNS для этого имени, но будет использовать этот IP-адрес. Однако клиент SSL будет удовлетворен тем, что имя хоста соответствует сертификату, и ошибка должна исчезнуть.

Для исправления HostnameVerifier вы должны следовать инструкциям в ответе, с которым вы связались. Клиент Netty SSL не использует статическую глобальную конфигурацию, которую вы используете в данный момент.

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