我有一个 grails 1.3.7 应用程序,它使用 apache HttpClient 对第三方进行 https api 调用。我点击的第三方 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
}
当我在开发模式下运行我的项目时,这很好用。我还可以直接从 curl 和我的浏览器调用相同的 URL,没有错误。但是,一旦我的项目被构建到一个 war 文件中并放在一个定义了证书/密钥库的 tomcat 实例上,以便客户端可以使用 https 连接到我们,我的请求开始失败,并出现以下 IOException:
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
我试图找出这里的失败点。
为什么从 curl 或我的开发模式发出 https 请求与从配置了 https 的 tomcat 实例发出 https 请求不同?
tomcat 实例不可公开访问,但是当我从浏览器连接到它时没有证书问题(chrome 表示证书很好,详细的 curl 请求也是如此)。
无论如何,我都不是 https/ssl 专家,所以我正在寻求帮助来解释什么是错误的,为什么它是错误的,以及我该如何解决它。我可以提供任何其他需要的信息。
---更新---
我启用了javax.net.debug
下面的建议,输出包括以下错误:
java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be\
non-empty
我的谷歌搜索让我认为这个问题是因为我在启动 tomcat 时使用了以下 java opt:
-Djavax.net.ssl.trustStore=/path/to/tomcat/conf/myStore.jks
如果这是真的,我怎样才能在 myStore.jks 中添加我需要的东西,而不是覆盖默认值,让每个人都开心?