HttpClient 4.1的SSL“Peer Not Authenticated”错误

时间:2012-07-31 23:16:56

标签: java ssl httpclient ssl-certificate

我正在构建一个简单的应用监视器来轮询我们的一个API URL,如果它无法从响应中获取HTTP 200状态代码,则给我们发电子邮件(这表明我们的API由于某种原因而关闭)。

我正在使用HttpClient 4.1 (这很重要,因为它的API与3.x的极大不同。)

我们的API使用SSL是安全的,但请输入:

  

http://example.com/our-api

进入网络浏览器会将您重定向到

  

https://example.com/our-api

不会造成任何错误。

当HttpClient尝试点击此网址(http://example.com/our-api)时,它会失败并显示javax.net.ssl.SSLPeerUnverifiedException个异常,并显示一条消息:

  

peer not authenticated

我发现这对其他人来说发生了很多事情,this帖子证明了这一点(这也提供了一些规避这个问题的方法 - 我今晚要尝试并实施的解决方案)。

这个其他帖子(以及其他类似的帖子)没有做的是解释为什么这首先发生!所以,而不是问“我该如何解决这个问题?”我想我会问“为什么会发生这种情况?”在我提前解决其中一个建议的解决方案之前,我想知道我试图解决的问题是什么; - )

4 个答案:

答案 0 :(得分:24)

如果服务器的证书是自签名的,那么这是按设计工作的,您必须将服务器的证书导入密钥库。

假设服务器证书由知名CA签名,则会发生这种情况,因为现代浏览器可用的CA证书集远远大于JDK / JRE附带的有限集。

您提到的其中一个帖子中提供的EasySSL解决方案只会掩盖错误,您不会知道服务器是否有有效的证书。

您必须将正确的根CA导入密钥库以验证证书。有一个原因是你不能用股票SSL代码解决这个问题,这是为了防止你编写那些表现得像是安全但不安全的程序。

答案 1 :(得分:6)

时抛出
  

......同伴无法识别自己(例如;没有   证书,正在使用的特定密码套件不支持   身份验证,或在SSL期间未建立对等身份验证   握手)抛出这个异常。

这个异常的原因(堆栈跟踪在哪里)可能会显示抛出此异常的原因。很可能Java附带的默认密钥库不包含(并信任)正在使用的TTP的根证书。

答案是检索根证书(例如,从您的浏览器SSL连接),将其导入cacerts文件,并使用Java JDK提供的keytool信任它。否则,您将不得不以编程方式分配另一个信任库。

答案 2 :(得分:1)

keytool -import -v -alias cacerts -keystore cacerts.jks -storepass changeit -file C:\cacerts.cer

答案 3 :(得分:0)

我不是java开发人员,而是使用java应用程序来测试RESTful API。为了让我修复错误,我必须在网络服务器中安装中间证书才能使错误消失。我使用的是lighttpd,原始证书安装在IIS服务器上。希望能帮助到你。这些是我在服务器上遗漏的证书。

  • CA.crt
  • UTNAddTrustServer_CA.crt
  • AddTrustExternalCARoot.crt