我面临着一个奇怪的问题,即Apache HTTPS客户端。我正在尝试连接到已启用基本身份验证的外部HTTPS网站(仅限SSL服务器身份验证)。以下是我的测试和结论的总结。
使用Chrome / Firefox / IE中的任何一个连接到网站 - >成功
使用javax.net.ssl.HttpsURLConnection
- >成功
使用DefaultHttpClient
或SystemDefaultHttpClient
- >失败
我尝试通过启用“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本机客户端之前,我想知道发生了什么。 任何关于这种行为的见解都将受到赞赏。
答案 0 :(得分:3)
经过大量搜索看起来这个奇怪的问题是因为Apache Client缺乏SNI支持。以下是讨论问题和可能的解决方案的JIRA
https://issues.apache.org/jira/browse/HTTPCLIENT-1119
以及可能的工作