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

How come Apache HttpClient 4.4 rejects www.googleapis.com as a valid host name?

我最近从 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)

问题来自于 HttpClient 现在使用 publicsuffix.org list for validation (see source code for SSLConnectionSocketFactory.java)。

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

CloseableHttpClient httpClient = HttpClients.custom().
   setSSLHostnameVerifier(new NoopHostnameVerifier()).build();

...但我试图理解为什么客户端不匹配通配符以及为什么它被认为过于宽泛 (reference).

RFC2818 spec 说:

Names may contain the wildcard
character * which is considered to match any single domain name
component or component fragment. E.g., *.a.com matches foo.a.com but
not bar.foo.a.com. f*.com matches foo.com but not bar.com.

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

这与通配符匹配本身无关。从 4.4 版开始,HttpClient 根据 Mozilla 维护的 public domain suffix 列表检查证书身份,以确保证书主题中的通配符或替代名称仅适用于非 public 域。例如 *.com*.co.uk 这样的模式应该被拒绝,因为太宽泛以至于不能防止它们被滥用。

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