SSL“对等未经过身份验证”错误,带有 HttpClient 4.1

2022-09-02 01:16:37

我正在构建一个简单的应用程序监视器来轮询我们的一个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-apijavax.net.ssl.SSLPeerUnverifiedException

对等体未经过身份验证

我看到这种情况在其他人身上经常发生,正如这篇文章所证明的那样(这也提供了一些规避这个问题的方法 - 事实上,我今晚将尝试并实施这个解决方案)。

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


答案 1

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

假设服务器证书由众所周知的 CA 签名,这是因为现代浏览器可用的 CA 证书集比 JDK/JRE 附带的有限证书集大得多。

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

您必须将正确的根 CA 导入密钥库以验证证书。您无法使用股票SSL代码解决此问题是有原因的,这是为了防止您编写行为看似安全但实际上不安全的程序。


答案 2

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

可能此异常的原因(堆栈跟踪在哪里)将显示引发此异常的原因。Java 附带的缺省密钥库很可能不包含(并且信任)正在使用的 TTP 的根证书。

答案是检索根证书(例如,从浏览器的SSL连接中),将其导入到文件中并信任它,该文件由Java JDK提供。否则,您必须以编程方式分配另一个信任存储区。cacertskeytool