我正在构建一个简单的应用监视器来轮询我们的一个API URL,如果它无法从响应中获取HTTP 200状态代码,则给我们发电子邮件(这表明我们的API由于某种原因而关闭)。
我正在使用HttpClient 4.1 (这很重要,因为它的API与3.x的极大不同。)
我们的API使用SSL是安全的,但请输入:
进入网络浏览器会将您重定向到
不会造成任何错误。
当HttpClient尝试点击此网址(http://example.com/our-api
)时,它会失败并显示javax.net.ssl.SSLPeerUnverifiedException
个异常,并显示一条消息:
peer not authenticated
我发现这对其他人来说发生了很多事情,this帖子证明了这一点(这也提供了一些规避这个问题的方法 - 我今晚要尝试并实施的解决方案)。
这个其他帖子(以及其他类似的帖子)没有做的是解释为什么这首先发生!所以,而不是问“我该如何解决这个问题?”我想我会问“为什么会发生这种情况?”在我提前解决其中一个建议的解决方案之前,我想知道我试图解决的问题是什么; - )
答案 0 :(得分:24)
如果服务器的证书是自签名的,那么这是按设计工作的,您必须将服务器的证书导入密钥库。
假设服务器证书由知名CA签名,则会发生这种情况,因为现代浏览器可用的CA证书集远远大于JDK / JRE附带的有限集。
您提到的其中一个帖子中提供的EasySSL解决方案只会掩盖错误,您不会知道服务器是否有有效的证书。
您必须将正确的根CA导入密钥库以验证证书。有一个原因是你不能用股票SSL代码解决这个问题,这是为了防止你编写那些表现得像是安全但不安全的程序。
答案 1 :(得分:6)
时抛出
......同伴无法识别自己(例如;没有 证书,正在使用的特定密码套件不支持 身份验证,或在SSL期间未建立对等身份验证 握手)抛出这个异常。
这个异常的原因(堆栈跟踪在哪里)可能会显示抛出此异常的原因。很可能Java附带的默认密钥库不包含(并信任)正在使用的TTP的根证书。
答案是检索根证书(例如,从您的浏览器SSL连接),将其导入cacerts
文件,并使用Java JDK提供的keytool
信任它。否则,您将不得不以编程方式分配另一个信任库。
答案 2 :(得分:1)
keytool -import -v -alias cacerts -keystore cacerts.jks -storepass changeit -file C:\cacerts.cer
答案 3 :(得分:0)
我不是java开发人员,而是使用java应用程序来测试RESTful API。为了让我修复错误,我必须在网络服务器中安装中间证书才能使错误消失。我使用的是lighttpd,原始证书安装在IIS服务器上。希望能帮助到你。这些是我在服务器上遗漏的证书。