我最近从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列表进行验证(参见SSLConnectionSocketFactory.java的源代码)。
解决此问题的一种方法是关闭主机名验证:
CloseableHttpClient httpClient = HttpClients.custom().
setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
...但我正在尝试理解为什么通配符与客户端不匹配以及为什么它被认为过于宽泛(reference)。
名称可能包含通配符
字符*
被认为与任何单个域名相匹配 组件或组件片段。例如,* .a.com匹配foo.a.com但是 不是bar.foo.a.com。 f * .com匹配foo.com但不匹配bar.com。
这是否意味着HttpClient 4.4不符合规范?
答案 0 :(得分:7)
这与通配符匹配本身无关。从版本4.4开始,HttpClient根据Mozilla维护的public domain suffix列表检查证书身份,以确保证书主题或替代名称中的通配符仅适用于非公共域。例如,*.com
或*.co.uk
的模式应该被拒绝,因为它们过于宽泛而无法防止滥用。
无论好坏,PSL现在还包含列表中的维护者所称的私有域' (对于公共域后缀列表而言,这是一个非常令人困惑的术语)。 googleapis.com
是此类域名之一。 HttpClient将处理私人'域名在下一个功能版本(4.5)中正确显示。有关详细信息,请参阅HTTPCLIENT-1613