我有两台Windows 7机器。我有Java 6应用程序,它调用某些外部HTTPS Web服务。为了使服务可以访问,我必须创建一个SSH隧道(通过putty)。但是,这个解决方案只能在一台机器上工作,因为第二台机器得到" java.lang.RuntimeException:未知的客户端异常"当应用程序尝试连接到Web服务时。有趣的是,我可以在第二台机器上的浏览器中通过URL访问服务。
更新:链接到堆栈跟踪文件:https://ufile.io/z1y8j
答案 0 :(得分:0)
您有两种解决方案可以解决此问题:
第一个是将证书添加到JVM。请参阅此链接:https://docs.oracle.com/javase/tutorial/security/toolsign/rstep2.html。
第二个如果你使用java httpClient来调用安全的Web服务,那么你应该忽略这个证书,所以你应该通过代码来配置它。
请参考此示例,我使用Spring的RestTemplate来调用其他Web服务并忽略认证。
例如:
@Bean
public RestTemplate restTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException{
TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;
SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom()
.loadTrustMaterial(null, (org.apache.http.ssl.TrustStrategy) acceptingTrustStrategy).build();
SSLConnectionSocketFactory csf = new
SSLConnectionSocketFactory(sslContext);
CloseableHttpClient httpClient =
HttpClients.custom().setSSLSocketFactory(csf).build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
return new RestTemplate(requestFactory);
}
答案 1 :(得分:0)
local_policy.jar
中的US_export_policy.jar
和jre/lib/security
存在问题。用不同的政策罐替换它们,现在一切正常。 ClientKeyExchange does not happen after ServerHelloDone