【问题标题】:Soap SSL handshake肥皂 SSL 握手
【发布时间】:2012-06-01 10:52:34
【问题描述】:

我的客户端通过 HTTP 成功地从服务器获得响应。

SOAPConnectionFactory sfc = SOAPConnectionFactory.newInstance();
SOAPConnection connection = sfc.createConnection();

SOAPMessage soapMessageResponse = connection.call(soapRequest, new URL(serviceLocation));

我想要客户端/服务器之间的 SSL 通信。

在另一个项目中,我成功地从 KeyStoreTrustManagerFactory 创建了 SSLSocketFactory,用于 SSL 握手。

如何在webservice客户端中使用SSLSocketFactory代码使客户端SSL通信成功调用服务器。

【问题讨论】:

    标签: java security soap ssl


    【解决方案1】:

    我很确定它会使用默认的 SSLContext。您可以使用 SSLContext.setDefault() 更改它。

    SSLContext c = SSLContext.getInstance("SSL");
    TrustManagerFactory tmf = TrustManagerFactory.getInstance("PKIX");
    tmf.init(yourKeystore);
    TrustManager tm = tmf.getTrustManagers()[0];
    tm.
    c.init(null, tm, null);
    

    这里有一些other values 用于上面的字符串参数。

    如果您需要更完整的控制,您可以实现自己的 SSLContext 子类,它返回您自己的 SSLSocketFactory 实现并将 SSLContext 设置为默认值:

    public class MySSLContext extends SSLContext {
    
        private SSLContext wrapped;
        private SSLSocketFactory mySocketFactory;
    
        public MySSLContext(SSLContext toWrap, SSLSocketFactory mySocketFactory) {
            wrapped = toWrap;
            this.mySocketFactory = mySocketFactory;
        }
    
        public SSLSocketFactory getSocketFactory() {
            return mySocketFactory;
        }
    
        public SSLSessionContext getClientSessionContext() {
            return wrapped;
        }
    
        // other delegates
    
    }
    

    【讨论】:

    • 顺便说一句,我讨厌像这样的 API,它只允许您在每个 VM 一次有一个活动实例。在 API 中几乎唯一可接受的静态用法是工厂方法和常量。
    • 你说:“很确定它会使用默认的 SSLContext”。我可以在哪里使用 SSLContext?请您简要介绍一下。
    • 我正在这样做。但是在 SOAP 客户端代码中哪里可以使用这个 SSLContext 呢?正如我所讨论的,我正在从 SSLContext 构建 SSLSocketFactory。
    • 正如我所说,我认为您在 SSLContext.setDefault() 上设置的任何内容都是 SOAPConnectionFactory 将使用的。如果您希望 SSLContext 使用您的 SSLSocketFactory,则需要子类化 SSLContext。我上面建议的委托实现应该可以工作。
    • 这是我第一条评论的重点。这是一个糟糕的 API 设计。 Java 的 SOAPConnection 实现是 HttpSOAPConnection。 HttpSOAPConnection 调用 URL.openConnection。 URL.openConnection 使用 URL.setURLStreamHandlerFactory 上提供的值。这设置为 HttpsURLConnectionImpl,它调用 HttpsURLConnection,它调用 SSLSocketFactory.getDefault()。这是一个主要是静态方法的巨大链。您只能全局修改它。从理论上讲,您可以解开整个混乱并设置自己的 URLStreamHandlerFactory。相信我,除非你绝对必须这样做,否则你不会想这样做。
    【解决方案2】:

    您好,如果您将此代码添加到您的网络服务类中,我认为您的问题将得到解决。

         `
    
       //just put it your somewhere 
     public static class miTM implements javax.net.ssl.TrustManager,
        javax.net.ssl.X509TrustManager {
    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
        return null;
    }
    
    public boolean isServerTrusted(
            java.security.cert.X509Certificate[] certs) {
        return true;
    }
    
    public boolean isClientTrusted(
            java.security.cert.X509Certificate[] certs) {
        return true;
    }
    
    public void checkServerTrusted(
            java.security.cert.X509Certificate[] certs, String authType)
            throws java.security.cert.CertificateException {
        return;
    }
    
    public void checkClientTrusted(
            java.security.cert.X509Certificate[] certs, String authType)
            throws java.security.cert.CertificateException {
        return;
    }
        }
    
    
    
    
    
     // CAll This function in your webservice class .
    private static void trustAllHttpsCertificates() throws Exception {
    
    // Create a trust manager that does not validate certificate chains:
    
    javax.net.ssl.TrustManager[] trustAllCerts =
    
    new javax.net.ssl.TrustManager[1];
    
    javax.net.ssl.TrustManager tm = new miTM();
    
    trustAllCerts[0] = tm;
    
    javax.net.ssl.SSLContext sc =
    
    javax.net.ssl.SSLContext.getInstance("SSL");
    
    sc.init(null, trustAllCerts, null);
    
    javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(
    
    sc.getSocketFactory());
    
        }
    

    【讨论】:

    • 这意味着 web 服务信任所有 SSL 证书而不检查它们,这在生产服务中可能不是一个好主意。
    【解决方案3】:

    这行代码在 SSL 的情况下不起作用。

    SOAPMessage soapMessageResponse = connection.call(soapRequest, new URL(serviceLocation));
    

    here 创建信任管理器和密钥管理器。

    为了从axis2 webservice通过SSL获得响应,你需要打开像给定here这样的流

    【讨论】:

      猜你喜欢
      • 2019-06-22
      • 2018-07-28
      • 2011-04-16
      • 2017-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多