HTTPSURLconnection和Apache(系统)DefaultHttpClient之间的证书链不同
我面临着一个奇怪的问题,即Apache HTTPS客户端。 我正在尝试连接到已启用基本身份validation的外部HTTPS网站(仅限SSL服务器身份validation)。 以下是我的测试和结论的摘要。
-
使用Chrome / Firefox / IE中的任何一个连接到网站 – >成功
-
使用
javax.net.ssl.HttpsURLConnection
– >成功 -
使用
DefaultHttpClient
或SystemDefaultHttpClient
– >失败
我尝试通过启用“javax.net.debug”到“ssl”进行调试。 我注意到两个客户端都选择了相同的信任存储(默认的JDK信任存储)并使用相同的协议(TLSv1)。 然而,差异在这里
我注意到JDK返回了以下扩展名
扩展server_name,server_name:[host_name:websitehostname]
而Apache Web客户端调试日志中缺少上述扩展名。
另外,我看到的另一个区别是在证书链中
以下来自JDK native的回复
*证书链[0] = [[版本:V3主题:** CN = websitename ,OU =域控制validation – RapidSSL(R),OU =参见www.rapidssl.com/resources/cps(c)13,OU = GT17702541,SERIALNUMBER = Q2La1fpFlFdNy4kUCIehYlMvw6bq64Ch签名算法:SHA1withRSA,OID = 1.2.840.113549.1.1.5
而在apache客户端以下
chain [0] = [[版本:V3主题:EMAILADDRESS = root @ i4319, CN = i4319 ,OU = SomeOrganizationalUnit,O = SomeOrganization,L = SomeCity,ST = SomeState,C = – 签名算法:SHA1withRSA,OID = 1.2 .840.113549.1.1.5
显然我用apache https客户端得到以下exception。
Exception in thread "main" javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
在我回去重做我的工作以使用JDK本机客户端之前,我想知道发生了什么。 任何有关此行为的见解将不胜感激。
经过大量搜索后,这个奇怪的问题是因为Apache Client缺乏SNI支持。 以下是JIRA,它讨论了问题和可能的解决方案
https://issues.apache.org/jira/browse/HTTPCLIENT-1119
并在这里可能的工作
- 创建IndexSearcher抛出IOException读取过EOF
- 嵌套事务用例中的外部事务没有看到数据库中持久存在的更新(JPA,MySQL,Spring Framework和Hibernate)
- 不推荐使用HttpClient.getParams()。 我该怎么用?
- 如何从apache httpclient 4中禁用默认请求标头?
- 如何在httpclient 4.3+中更新HttpClient的设置?
- Apache http客户端默认设置不适用于sni
- 从Commons HttpClient迁移到HttpComponents Client
- 在HTTPClient 4.1中使用文件和字符串进行多部分POST
- Apache HTTPClient SSLPeerUnverifiedException
- javax.net.ssl.SSLPeerUnverifiedException:主机名与对等方提供的证书主题不匹配
- 使用apache httpClient客户端将发布数据发送到https而不使用ssl证书validation