SSL 握手,播放主机名不匹配



我们正在使用 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中以编程方式实现这一点

任何帮助将不胜感激!

谢谢

苏雷什

"主机"修复如下所示:

  1. hosts文件中添加如下所示的行(此处为 Windows 或 Linux 的说明(

    123.234.34.56 api.a.b.c.net
    
  2. 现在使用主机名"api.a.b.c.net"而不是其 IP 地址连接到服务器

  3. 由于hosts覆盖,您的计算机不会对此名称执行 DNS 查找,但会使用该 IP 地址。但是,SSL 客户端将确信主机名与证书匹配,并且错误应该消失。

对于主机名验证程序修复,您需要按照链接到的答案中的说明进行操作。Netty SSL 客户端不使用您当前使用的静态全局配置。

相关内容

最新更新