SSL:两个DNS名称,1个IP,2个证书 - Java只看到1并抱怨

时间:2013-07-19 14:26:08

标签: java ssl https

我有一个Apache映射到两个外部DN:

sub1.dn.com
sub2.dn.com

两者都映射到相同的IP。

每个都有自己的SSL证书。每个证书都按原样显示CN和SAN并匹配(即sub1为sub1.dn.com,sub2为相同)。

但是,当我的Java代码尝试连接到 sub2.dn.com 时 失败了,有: javax.net.ssl.SSLHandshakeException:java.security.cert.CertificateException:无主题替换 找到 sub2.dn.com 的DNS名称匹配。

启用Java SSL调试输出显示奇怪的东西 - 似乎Java下载并使用另一个(sub1)证书!!

[3]: ObjectId: 2.5.29.17 Criticality=false
SubjectAlternativeName [
  DNSName: **sub1.dn.com**
]

所以浏览器似乎很开心,并获得正确的证书。但Java总是看到sub1.dn.com证书,而不是另一个。因此,当调用sub2时,它显然不匹配。

为什么Java会这样做?也许如何解决它!感谢

1 个答案:

答案 0 :(得分:3)

如果在运行的同一IP上有两个HTTPS域,则客户端需要支持SNI(Server Name Indication)才能选择正确的证书。请注意,SNi只能使用TLS,不支持SSL。

Java 7 has SNI support,因此您应该检查您是否使用当前的Java版本。

在服务器端,确保支持TLS和首选协议。