2013-02-22 41 views
2

我正在为供应商控制的SOAP web服务构建客户端。不幸的是,他们的开发者服务器有一个我无法验证的不安全(自签名)证书。每当我尝试发出请求时,Apache Axis都会失败。有没有办法忽略SSL验证错误?我显然不想为生产做这件事,但它在我的开发环境中会很好。忽略Axis客户端的无效证书

+0

还有一个相关的StackOverflow答案 - 也适用于我:http://stackoverflow.com/questions/10913185/ignore-certification-authentication-on-axis-client-for-wcf-service#10913791 – 2015-11-11 23:09:33

回答

1

尝试了一些解决方案后,有什么最后的工作是安装自定义协议处理,并将其与特定的关联ServiceClient

private void configureServiceClient(ServiceClient client) { 
     SSLContext ctx; 
     try { 
      KeyStore truststore = KeyStore.getInstance("JKS"); 
      truststore.load(getClass().getResourceAsStream("/truststore.jks"), 
        "latitude".toCharArray()); 

      ctx = SSLContext.getInstance("SSL"); 
      TrustManagerFactory tmf = TrustManagerFactory 
        .getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
      tmf.init(truststore); 
      ctx.init(null, tmf.getTrustManagers(), null); 
     } catch (Exception e) { 
      logger.error("Exception loading Bold trust store", e); 
      throw new RuntimeException(e); 
     } 

     SSLProtocolSocketFactory sslFactory = new SSLProtocolSocketFactory(ctx); 
     Protocol prot = new Protocol("https", 
       (ProtocolSocketFactory) sslFactory, 443); 
     client.getOptions().setProperty(HTTPConstants.CUSTOM_PROTOCOL_HANDLER, 
       prot); 
} 

到这样做的好处是它并不需要我来覆盖所有可能潜在地打破东西的道路,如果新的证书是我为我的应用程序的SSL连接ssued。如果一个新的证书颁发,这个肯定会破坏,但它只是一个连接,而不是所有的连接。

2

尝试禁用证书验证,把下面的代码你犯了一个请求调用之前 -

// Create a trust manager that does not validate certificate chains 
    final TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { 
      @Override 
      public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
       return null; 
      } 

      @Override 
      public void checkClientTrusted(X509Certificate[] certs, String authType) { 
      } 

      @Override 
      public void checkServerTrusted(X509Certificate[] certs, String authType) { 
      } 
     } 
    }; 

    // Install the all-trusting trust manager 
    try { 
     SSLContext sc = SSLContext.getInstance("SSL"); 
     sc.init(null, trustAllCerts, null); 
     HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
    } catch (Exception ex) { 
     // take action 
    } 
+0

这实际上不适合我,但是,我确实发布了最终的结果。我明白你的建议,我不确定为什么它不适合我。 – 2013-04-01 19:56:12

+3

有趣,但是如果你设置了默认的SSL套接字工厂,那么它就不起作用了,但是如果你做了'SSLContext.setDefault(sc);',它就可以工作。 Oracle Java 1.6 – user1516873 2013-06-14 08:53:13