Java 8 的一个 SNI 的 bug

联动上一篇博文,在解决了 OpenResty 上那个 SNI 的问题之后,我们发现有一个 Java 应用也有类似的问题。而最后发现,这是因为我们当前版本的 Java 中有一个 bug……

简单来说,就是在 Java 1.8u141 之前,HttpsURLConnection#setDefaultHostnameVerifier() 方法会破坏 SNI,而正好我们的代码里有这么一行:

1
HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);

翻了下框架的代码,发现如果我不设定这个值,框架也调用这个方法来指定它默认的 hostname verifier;而如果我传个 null,那么它会抛个异常给我。所以,代码层面没有很方便的解决方案。

无奈,最后决定,先临时换了个没开启 SNI 的域名,暂时解决掉问题,然后升级 Java 到 1.8u181,一劳永逸。


终于,我也有机会理直气壮地喊出 “这是 Java 的 bug” 了!(笑

[^1]: Extended server_name (SNI Extension) not sent with jdk1.8.0 but send with jdk1.7.0
[^2]: Custom HostnameVerifier disables SNI support on client in Java 8