我们正在使用Play 2.5 + Scala,需要使用SSL通过https连接到远程客户端。
问题是我们从客户端获得的证书有CN类似api.*.*.*.net
但我们尝试点击的实际网址包含一个IP地址:
https://123.234.34.56/service/resource/operation...
由于证书中的公用名和URL中的主机名(ipAddress)不匹配,我们看到以下错误。
SSLHandshakeException: No subject alternative names present
所以我尝试在Scala中实现HostnameVerifier,如下所示,但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 hostname verification support
但不确定我是否需要根据上面的链接实现ChannelFactory,如下所示http://netty.io/3.10/xref/org/jboss/netty/example/securechat/SecureChatClientPipelineFactory.html
此外,我在SO帖子中看到了其他地方:
如果证书中的主机名未解析为该地址,则服务器配置错误。不过,您应该能够更改本地DNS解析,将该名称指向/ etc / hosts文件中的此IP地址(如果在Linux下,或其Windows等效项
我不知道如何在Java / Scala中以编程方式实现此目的
非常感谢任何帮助!
由于
苏雷什
答案 0 :(得分:2)
"主持人"修复看起来像这样:
在您的hosts
文件(instructions for Windows or Linux here)
123.234.34.56 api.a.b.c.net
现在使用主机名" api.a.b.c.net"连接到服务器,而不是其IP地址
由于hosts
覆盖,您的计算机不会对此名称执行DNS查找,但会使用该IP地址。但是,SSL客户端将满足主机名与证书匹配,错误应该消失。
对于HostnameVerifier修复,您需要按照链接到的答案中的说明进行操作。 Netty SSL客户端不使用您当前使用的静态全局配置。