使用 HttpClient POST 到 Form 但在浏览器中获取 SSLPeerUnverifiedException 工作正常

Posted

技术标签:

【中文标题】使用 HttpClient POST 到 Form 但在浏览器中获取 SSLPeerUnverifiedException 工作正常【英文标题】:Using HttpClient to POST to Form but Getting SSLPeerUnverifiedException yet browser Works Fine 【发布时间】:2011-05-29 16:40:22 【问题描述】:

使用 HttpClient 4.1.0,我们正在尝试连接到通常使用表单连接到的远程服务器。顺便说一句,这将用于生产用途,但我不会将我们发送的信息称为敏感信息。我不确定他们是否会坚持使用 https 连接。

当我们尝试调用 httpClient.execute(httpPost) 时,它会抛出 SSLPeerUnverifiedException

我们正在使用 ThreadSafeClientConnManager 创建 DefaultHttpClient,并已验证 https 注册表与 SSLSocketFactory 相关联。

我们正在连接到这样的网址:https://some.thingchangedtoprotectthem.com/servlet/servlet.Something

为什么浏览器会像魅力一样工作,但使用服务器端进程会因该异常而崩溃?是因为浏览器带有威瑞信证书而 HttpClient 没有吗?

System.out and Stack trace below:
    schemeSocketFactory = org.apache.http.conn.ssl.SSLSocketFactory
    javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
          at com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:345)
          at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128)
          at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:390)
          at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
          at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
          at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
          at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:562)
          at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
          at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
          at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
          at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)

【问题讨论】:

在考虑了更多之后,他们可能想要保护一两个项目,但我会检查一下。我可能会完全改变我的策略。 【参考方案1】:

确实如此。你应该看看这个blog post,作者描述了如何在你的密钥库中下载和安装证书。它是为 android 开发人员编写的文章,但它绝对适用于您的情况。

最坏的情况,this question 会告诉您如何信任所有证书,尽管这不是一个好主意。 ;)

【讨论】:

【参考方案2】:

“是不是因为浏览器自带verisign证书而HttpClient没有?”

几乎可以肯定。

请参阅this message 了解如何修复它。

【讨论】:

以上是关于使用 HttpClient POST 到 Form 但在浏览器中获取 SSLPeerUnverifiedException 工作正常的主要内容,如果未能解决你的问题,请参考以下文章

httpclient通过post multipart/form-data 上传文件

HttpClient使用post方法提交数据后服务端如何获得这些参数

httpclient模拟post(applecation/x-www-form-urlencoded方式)请求

如何通过HttpClient去POST一个multipart/form-data数据

httpclient模拟POST multipart/form-data格式的数据

httpclient x-www-form-urlencoded