HttpClient 4.1的SSL"Peer Not Authenticated"错误

IAm*_*aja 20 java ssl httpclient ssl-certificate

我正在构建一个简单的应用程序监视器来轮询我们的一个API URL并向我们发送电子邮件,如果它无法从响应中获取HTTP 200状态代码(这表明我们的API因某种原因而关闭).

我正在使用HttpClient 4.1(这很重要,因为它的API与3.x 差别很大).

我们的API使用SSL是安全的,但输入:

http://example.com/our-api

进入Web浏览器重定向到

https://example.com/our-api

没有造成任何错误.

当HttpClient尝试命中此URL(http://example.com/our-api)时,它会失败并显示javax.net.ssl.SSLPeerUnverifiedException一条消息,指出:

peer未经过身份验证

我看到这对其他人来说发生了很多事情,正如这篇文章所证明的那样(这也提供了一些规避这个问题的方法 - 我将在今晚尝试和实施的解决方案).

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

Jim*_*son 24

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

假设服务器证书由知名CA签名,则会发生这种情况,因为现有浏览器可用的CA证书集远远大于JDK/JRE附带的有限集.

您提到的其中一个帖子中给出的EasySSL解决方案只会掩盖错误,您不会知道服务器是否具有有效证书.

您必须将正确的根CA导入密钥库以验证证书.有一个原因你不能用股票SSL代码解决这个问题,这是为了防止你编写的程序表现得像是安全但不安全.


Maa*_*wes 6

这是抛出的时候

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

可能是此异常的原因(堆栈跟踪在哪里)将显示抛出此异常的原因.很可能Java附带的默认密钥库不包含(并信任)正在使用的TTP的根证书.

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