为什么Apache HttpClient 4.4拒绝www.googleapis.com作为有效的主机名?

alb*_*ano 7 ssl apache-httpclient-4.x

我最近从4.3切换到HttpClient 4.4,我得到了SSLPeerUnverifiedException这样的说法:

Host name 'www.googleapis.com' does not match the certificate subject provided by the peer (CN=*.googleapis.com, O=Google Inc, L=Mountain View, ST=California, C=US)
Run Code Online (Sandbox Code Playgroud)

问题来自于HttpClient现在使用publicsuffix.org列表进行验证(参见SSLConnectionSocketFactory.java的源代码).

解决此问题的一种方法是关闭主机名验证:

CloseableHttpClient httpClient = HttpClients.custom().
   setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
Run Code Online (Sandbox Code Playgroud)

...但我试图理解为什么通配符与客户端不匹配以及为什么它被认为太宽泛(参考).

RFC2818规范说:

名称可以包含通配符
字符*,其被认为是匹配任何单个域名
组件或组件片段.例如,*.a.com匹配foo.a.com但
不匹配bar.foo.a.com.f*.com匹配foo.com但不匹配bar.com.

这是否意味着HttpClient 4.4不符合规范?

ok2*_*k2c 7

这与通配符匹配本身无关.从版本4.4开始,HttpClient 根据Mozilla维护的公共域后缀列表检查证书身份,以确保证书主题或备用名称中的通配符仅适用于非公共域.例如,作为*.com*.co.uk应该被拒绝的模式过于宽泛以防止其被滥用.

无论好坏,PSL现在还包含列表中的维护者所称的"私有域"(对于公共域后缀列表而言,这是一个非常令人困惑的术语).googleapis.com是这样的领域之一.从下一个功能版本(4.5)开始,HttpClient将正确处理"私有"域.有关详细信息,请参阅HTTPCLIENT-1613