使用HttpClient POST到表单但获取SSLPeerUnverifiedException但浏览器工作正常

时间:2011-05-29 16:40:23

标签: java ssl httpclient

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

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

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

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

为什么浏览器会像魅力一样工作,但使用服务器端流程会因为该异常而崩溃?是因为浏览器附带了verisign证书而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)

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

几乎可以肯定。

有关如何解决问题的建议,请参阅this message