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