22

我正在构建一个简单的应用程序监视器来轮询我们的一个 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异常并显示一条消息:

对等体未通过身份验证

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

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

4

4 回答 4

25

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

假设服务器证书是由知名 CA 签署的,这是因为现代浏览器可用的 CA 证书集远大于 JDK/JRE 附带的有限集。

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

您必须将正确的根 CA 导入您的密钥库以验证证书。使用现有的 SSL 代码无法解决这个问题是有原因的,这是为了防止您编写表现得好像它们是安全的但实际上并不安全的程序。

于 2012-07-31T23:23:32.263 回答
7

这是抛出时

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

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

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

于 2012-07-31T23:26:34.083 回答
1
keytool -import -v -alias cacerts -keystore cacerts.jks -storepass changeit -file C:\cacerts.cer
于 2016-03-22T12:42:41.733 回答
0

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

  • CA.crt
  • UTNAddTrustServer_CA.crt
  • AddTrustExternalCARoot.crt
于 2014-10-15T17:32:18.987 回答