java - HttpClient 4.1 出现 SSL "Peer Not Authenticated"错误

标签 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 尝试访问此 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/

相关文章:

java - 如何使用 Web 客户端获取经过数据验证的页面

c# - 如何使用 PCL 支持从 xamarin 跨平台项目中的 URL 下载文件

Java paypal 调用从不返回结果

java - 在 swing 项目中使用 JavaFx 应用程序

security - 仅针对 IE 用户的 SSL 证书错误

iOS9 GoogleAnalytics 和 NSAppTransportSecurity

ssl - 生成弱 X509 证书

java - Android HTTP POST 参数发送但服务器未收到

java - 在抽象类的扩展之间共享变量

java - 在 Hibernate/JPA 中可选地使用级联