【问题标题】:Certificate chain different between HTTPSURLconnection and Apache (System) DefaultHttpClientHTTPSURLconnection 和 Apache(系统)DefaultHttpClient 之间的证书链不同
【发布时间】:2013-07-31 16:01:16
【问题描述】:

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

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

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

  • 使用DefaultHttpClientSystemDefaultHttpClient -> 失败

我尝试通过将“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


【解决方案1】:

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

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

还有一个可能的解决方法

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

【讨论】:

    猜你喜欢
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 2011-02-26
    • 2016-01-12
    • 2021-01-08
    • 1970-01-01
    • 2015-01-14
    相关资源
    最近更新 更多