【发布时间】:2013-07-31 16:01:16
【问题描述】:
我在 Apache HTTPS 客户端遇到了一个奇怪的问题。我正在尝试连接到启用了基本身份验证的外部 HTTPS 网站(仅限 SSL 服务器身份验证)。这是我的测试和结论的摘要。
使用 Chrome/Firefox/IE 中的任何一个连接到网站 -> 成功
使用
javax.net.ssl.HttpsURLConnection-> 成功使用
DefaultHttpClient或SystemDefaultHttpClient-> 失败
我尝试通过将“javax.net.debug”启用为“ssl”来进行调试。我注意到两个客户端都选择了相同的信任库(默认 JDK 信任库)并使用相同的协议(TLSv1)。 但是,差异就在这里
我注意到JDK返回了以下扩展名
扩展服务器名,服务器名:[主机名:网站主机名]
而 Apache Web 客户端调试日志中缺少上述扩展。
另外,我看到的另一个区别是证书链
以下来自 JDK 原生的响应
* 证书链 链 [0] = [ [ 版本:V3 主题:**CN=网站名称,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 客户端中如下
链 [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 本地客户端之前,我想知道发生了什么。 对此行为的任何见解将不胜感激。
【问题讨论】:
-
我真的不知道(Apache HTTP客户端底层的SSLSocketFactory最终与JDK用于HTTPSURLConnection的相同),但首先想到的可能是代理设置,你应该启用“电线”调试并检查一个客户端或另一个客户端是否通过一个......代理擅长在进行 SSL 过滤时生成假证书。
-
如果你说的是我网络中的代理,那么我不得不说,我从来没有配置过(例如在浏览器中)。
标签: java ssl https apache-httpclient-4.x sni