HTTPSURLconnection和Apache(系统)DefaultHttpClient之间的证书链不同

我面临着一个奇怪的问题,即Apache HTTPS客户端。 我正在尝试连接到已启用基本身份validation的外部HTTPS网站(仅限SSL服务器身份validation)。 以下是我的测试和结论的摘要。

  • 使用Chrome / Firefox / IE中的任何一个连接到网站 – >成功

  • 使用javax.net.ssl.HttpsURLConnection – >成功

  • 使用DefaultHttpClientSystemDefaultHttpClient – >失败

我尝试通过启用“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

并在这里可能的工作

https://wiki.apache.org/HttpComponents/SNISupport