1

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

  • 使用 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=域控制验证 - 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 本地客户端之前,我想知道发生了什么。对此行为的任何见解将不胜感激。

4

1 回答 1

3

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

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

和一个可能的工作在这里

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

于 2013-08-01T16:59:31.210 回答