2015-03-03 304 views
0

我们有一个进程使用HttpClient使https与不同的URL连接。我们的JDK版本是1.7。我们发现了一些网址,如果我们使用默认JSSE SIN扩展标记,这是打开,我们得到了以下异常:SSL握手无法识别的名称异常

javax.net.ssl.SSLProtocolException: handshake alert: unrecognized_name 

如果我们设置-Djsse.enableSNIExtension =假,其他的一些网址,抛出此异常:

javax.net.ssl.SSLException: Received fatal alert: unrecognized_name 

有没有人有这方面的想法?

+0

请添加此类网址的示例(仅限公共网站)。 – 2015-03-04 06:50:44

+1

[SSL握手警报:自升级到Java 1.7.0以来无法识别的\ _name错误]的可能重复(http://stackoverflow.com/questions/7615645/ssl-handshake-alert-unrecognized-name-error-since-upgrade- to-java-1-7-0) – 2015-03-04 06:53:08

+0

奇怪的是,如果将SNI扩展标志设置为false,服务器扩展名不应该被计数,但仍然会得到unrecognized_name错误,对此有何看法? – Shawn 2015-03-06 16:39:34

回答

0

SNI扩展将在SSL握手阶段的客户端hello消息中添加server_name(主机名)。

服务器可能需要为不同主机名或虚拟主机提供服务请求。它用于解析客户打算与之通信的主机名的证书。如果未添加或未找到主机名,则可以使用默认证书配置服务器。默认证书可能是其所服务的所有主机的多重签名证书。

您得到的第一个警告可能是服务器使用默认证书响应,但也会警告主机名无法识别。服务器可能不会简单地识别主机名称,因为它不包含在配置中。 Java似乎抛出一个异常,而不是忽略警告并使用默认证书。

在禁用SNI的其他情况下,您不再包括主机名,并且将请求发送到没有默认证书的服务器。它会回应一个致命的错误,因为它无法为您解决任何证书。