HttpClient 4.1的SSL“Peer Not Authenticated”错误如何解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (60)

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

我使用HttpClient 4.1(这很重要,因为它的API与3.x 差别很大)。

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

http://example.com/our-api

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

https://example.com/our-api

不会造成任何错误。

当HttpClient尝试点击这个URL(http://example.com/our-api)时,它会失败,javax.net.ssl.SSLPeerUnverifiedException并显示一条消息,指出:

peer not authenticated

我看到这种情况出现了很多其他人如被证明文章(其中还提供了绕过这个问题的办法-我要尝试,事实上实行今晚的解决方案)。

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

提问于
用户回答回答于

如果服务器的证书是自签名的,那么这是按照设计工作的,将不得不将服务器的证书导入到密钥库中。

假设服务器证书由知名CA签署,因为现代浏览器可用的一组CA证书比JDK / JRE附带的限制集大得多。

提到的其中一篇文章中给出的EasySSL解决方案只是掩盖错误,而不知道服务器是否具有有效证书。

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

用户回答回答于

这是在什么时候抛出的

...对等端无法识别自身(例如,没有证书,正在使用的特定密码套件不支持身份验证,或者在SSL握手期间没有建立对等身份验证)引发此异常。

可能是这个异常的原因(stacktrace在哪里)会告诉你为什么抛出这个异常。很有可能Java附带的默认密钥库不包含(并信任)正在使用的TTP的根证书。

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

扫码关注云+社区

领取腾讯云代金券