使用Java通过SSH隧道无法访问Web服务

时间:2018-03-27 12:56:14

标签: java ssh connection tunnel

我有两台Windows 7机器。我有Java 6应用程序,它调用某些外部HTTPS Web服务。为了使服务可以访问,我必须创建一个SSH隧道(通过putty)。但是,这个解决方案只能在一台机器上工作,因为第二台机器得到" java.lang.RuntimeException:未知的客户端异常"当应用程序尝试连接到Web服务时。有趣的是,我可以在第二台机器上的浏览器中通过URL访问服务。

更新:链接到堆栈跟踪文件:https://ufile.io/z1y8j

2 个答案:

答案 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.jarjre/lib/security存在问题。用不同的政策罐替换它们,现在一切正常。 ClientKeyExchange does not happen after ServerHelloDone