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

时间:2013-07-31 16:01:17

标签: java ssl https apache-httpclient-4.x sni

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

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

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

  • 使用DefaultHttpClientSystemDefaultHttpClient - >失败

我尝试通过启用“javax.net.debug”到“ssl”进行调试。我注意到两个客户端都选择了相同的信任存储(默认的JDK信任存储)并使用相同的协议(TLSv1)。 但是,差异在这里

我注意到JDK返回了以下扩展名

  

Extension server_name,server_name:[host_name:websitehostname]

虽然Apache Web客户端调试日志中缺少上述扩展名。

另外,我看到的另一个不同之处在于证书链

来自JDK原生的以下回复

  

*证书链   链[0] = [   [     版本:V3     主题:** CN = websitename ,OU =域控制验证 - 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 in thread "main" javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated

在我回去重做我的工作以使用JDK本机客户端之前,我想知道发生了什么。 任何关于这种行为的见解都将受到赞赏。

1 个答案:

答案 0 :(得分:3)

经过大量搜索看起来这个奇怪的问题是因为Apache Client缺乏SNI支持。以下是讨论问题和可能的解决方案的JIRA

https://issues.apache.org/jira/browse/HTTPCLIENT-1119

以及可能的工作

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