我正在构建一个简单的应用程序监视器来轮询我们的 API URL 之一,如果无法从响应中获取 HTTP 200 状态代码,则向我们发送电子邮件(这表明我们的 API 由于某种原因已关闭)。
我正在使用 HttpClient 4.1(这很重要,因为它的 API 与 3.x有很大不同)。
我们的 API 通过 SSL 保证安全,但是输入:
网络浏览器会将您重定向至
不会导致任何错误。
当 HttpClient 尝试访问此 URL (http://example.com/our-api
) 时,它会失败并出现 javax.net.ssl.SSLPeerUnverifiedException
异常并附有一条消息:
peer not authenticated
我看到其他人经常发生这种情况,this 就证明了这一点。帖子(它还提供了一些规避这个问题的方法 - 实际上我今晚将尝试并实现一个解决方案)。
这篇文章(以及其他类似的文章)没有做的是解释为什么会发生这种情况!因此,不要问“我该如何解决这个问题?”我想我会问“为什么会发生这种情况?”在我继续提出建议的解决方案之一之前,我想知道我正在尝试解决的问题是什么;- )
最佳答案
如果服务器的证书是自签名的,那么这将按设计工作,您必须将服务器的证书导入到您的 keystore 中。
假设服务器证书由知名 CA 签名,发生这种情况是因为现代浏览器可用的 CA 证书集远大于 JDK/JRE 附带的有限集。
您提到的一篇文章中给出的 EasySSL 解决方案只是掩盖了错误,您不知道服务器是否具有有效的证书。
您必须将正确的根 CA 导入到 keystore 中才能验证证书。您无法使用现有的 SSL 代码来解决此问题是有原因的,这是为了防止您编写看似安全但实际上并不安全的程序。
关于java - HttpClient 4.1 出现 SSL "Peer Not Authenticated"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57158836/