我在 Apache HTTPS 客户端面临一个奇怪的问题。我正在尝试连接到启用了基本身份验证的外部 HTTPS 网站(仅限 SSL 服务器身份验证)。这是我的测试和结论的摘要。
使用 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=域控制验证 - RapidSSL(R), OU=参见 www.rapidssl.com/resources/cps (c)13, OU =GT17702541,序列号=Q2La1fpFlFdNy4kUCIehYlMvw6bq64Ch 签名算法:SHA1withRSA,OID = 1.2.840.113549.1.1.5
在apache客户端中,以下
链 [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 本地客户端之前,我想知道发生了什么。对此行为的任何见解将不胜感激。