为什么我得到javax.net.ssl.SSLPeerUnverifiedException:同行不

2019-09-16 08:45发布

我有一个Grails 1.3.7应用程序发出HTTPS API调用使用Apache HttpClient的第三方。 我打了第三方URL具有有效的证书。 我创建和执行,像这样我的要求:

HttpClient client = new DefaultHttpClient()

List<BasicNameValuePair> queryParams = new ArrayList<BasicNameValuePair>()
queryParams.add(new BasicNameValuePair("a_parameter", "a_parameter_value"))

URI uri = URIUtils.createURI("https", "third.party.address", 443, "/some/url/for/us", URLEncodedUtils.format(queryParams, "UTF-8"), null)
HttpGet httpGet = new HttpGet(uri)

try {
    log.debug "Sending request to ${uri}"
    return client.execute(httpGet)
} catch(HttpException e) {
    log.error "HttpException during location lookup request: ${e}"
    return
} catch(IOException e) {
    log.error "IOException during location lookup request: ${e}"
    return
}

当我跑步时我在开发模式的项目也能正常工作。 我也可以直接调用从卷曲相同的URL和我的浏览器没有任何错误。 但是,一旦我的项目生成到一个战争文件,并把对已定义了证书/密钥库Tomcat实例,以便客户端可以使用HTTPS连接到美国,我的要求先从以下IOException异常失败:

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated

我想在这里找出故障点。

为什么正在从卷曲的HTTPS请求或我的开发模式,不是使从配置Tomcat实例的HTTPS HTTPS请求不同?

Tomcat实例是不能公开访问,但是当我连接到它从我的浏览器(Chrome说,证书是好的,因为做了详细的卷曲要求)有没有证书的问题。

我不是任何延伸的HTTPS / SSL专家,所以我在寻找帮助解释什么是错的,为什么这是错的,我怎么能解决这个问题。 我可以提供任何其他必要的信息。

---更新---我启用了javax.net.debug如下建议,输出包含以下错误:

java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be\
 non-empty

我的谷歌搜索让我觉得这个问题是因为我起tomcat时,使用下面的Java选择:

-Djavax.net.ssl.trustStore=/path/to/tomcat/conf/myStore.jks

如果这是真的,我怎么能加我需要myStore.jks的事情,所以大家都高兴不覆盖默认值?

Answer 1:

对我来说,解决方案结束了,我们是压倒一切与我们自己的缺省Java信任库与Java选择。 这导致由第三方发送到似乎是无效的,因为我们没有任何在我们myStore.jks默认的根证书的证书。

通过将我们的自签名证书到默认的java一个(/ lib / security中/ cacerts中),并删除java的选择,一切都很好。

另一种方法是在默认的Java软件商店添加一切到自定义存储和仍然使用java选择。 无论您找到适合您的情况更容易维护。



Answer 2:

我已经看到了这个错误太多次。 我已经使用以下工具从使用SSL网站抢证书。 转到这里并抓住InstallCert 。 编译并运行该程序。 你可以使用这是由该实用程序作为一个密钥生成的文件。



文章来源: Why do I get javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated only in production?