【发布时间】:2015-01-20 18:12:06
【问题描述】:
我目前正在使用 Apache HttpClient(特别是 4.2.3 版)向我的应用程序添加 https 下载功能。
如果证书验证失败,我想获得服务器证书链。抛出的异常 SSLPeerUnverifiedException 没有提供任何信息的字段。
try {
HttpResponse response = client.execute(get);
} catch (SSLPeerUnverifiedException e) {
// retrieve server certificate here
}
有一种方法是将TrustManager(用于捕获证书)注入SSLContext,并为每个请求重新创建SSLContext、SSLSocketFactory 和HttpClient。但是,我希望能够为多个可能的并行请求重用这些实例。
【问题讨论】:
-
您随后通过
SSLSocket描述的方式是我知道的唯一方式。如果HttpClient以某种方式提供了这种能力,我不知道。基本上我创建了一个虚拟TrustManager,它保留了checkServerTrusted内的证书链,然后如果握手引发证书验证错误,它会处理获得的证书链。如果你愿意,我可以在答案中显示一些代码,但看起来你真的已经知道如何做到这一点,并希望通过 HttpClient 来做到这一点。 -
谢谢,我已经用这种方式实现了。我只是想知道这是否可以通过重用 HttpClient 或至少 SSLContext、SSLSocketFactory 和 TrustManager 来完成。这样做的原因是为了在 httpclient 上获得连接重用/缓存等功能。
标签: java ssl certificate httpclient apache-httpclient-4.x