【发布时间】:2017-07-23 07:18:45
【问题描述】:
我们正在使用 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 中实现 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 中以编程方式实现这一点
任何帮助将不胜感激!
谢谢
Suresh
【问题讨论】:
-
@Bruno 请你看看我上面的查询。 ?谢谢
标签: scala ssl playframework sslhandshakeexception