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" выглядит так:
Добавьте следующую строку в ваш
hosts
файл ( инструкция для Windows или Linux здесь)123.234.34.56 api.a.b.c.net
Теперь подключитесь к серверу, используя имя хоста "api.abcnet", а не его IP-адрес
Из-за
hosts
переопределить, ваш компьютер не будет выполнять поиск DNS для этого имени, но будет использовать этот IP-адрес. Однако клиент SSL будет удовлетворен тем, что имя хоста соответствует сертификату, и ошибка должна исчезнуть.
Для исправления HostnameVerifier вы должны следовать инструкциям в ответе, с которым вы связались. Клиент Netty SSL не использует статическую глобальную конфигурацию, которую вы используете в данный момент.