【问题标题】:WSImport over SSL with fake (dev) certificateWSImport over SSL with fake (dev) 证书
【发布时间】:2015-04-28 14:37:46
【问题描述】:

最近我花了几个小时试图让 WSImport 在通过 HTTPS 托管的 Web 服务上工作,并使用假证书(开发部署)。

我尝试使用 Windows 版本的 wsimport.exe,来自 Java 8 jdk。

我指定了选项-XdisableSSLHostnameVerification,但它一直抱怨错误的证书。 没错,证书是无效的,但在开发环境中它应该是可以接受的。

我没有找到简单的方法让 wsimport 跳过证书检查。

【问题讨论】:

    标签: java ssl https webservice-client wsimport


    【解决方案1】:

    最后我得到了一个解决方案,使用包装类。

    我认为分享解决方案是有意义的。 希望它会为更好的目的节省一些人的时间。

    解决方法(假设java安装在c:\Program Files\Java\jdk1.8.0_40):

    1. 如何编译

      "c:\Program Files\Java\jdk1.8.0_40\bin\javac" -cp "c:\Program Files\Java\jdk1.8.0_40\lib\tools.jar" WSImportSSLByPass.java

    2. 如何使用

      "c:\Program Files\Java\jdk1.8.0_40\bin\java" -cp "c:\Program Files\Java\jdk1.8.0_40\lib\tools.jar";. WSImportSSLByPass %wsimport args%

    3. 代码

    要放入WSImportSSLByPass.java

        import java.security.KeyManagementException;
        import java.security.NoSuchAlgorithmException;
        import java.security.SecureRandom;
        import java.security.cert.X509Certificate;
    
        import javax.net.ssl.HostnameVerifier;
        import javax.net.ssl.HttpsURLConnection;
        import javax.net.ssl.SSLContext;
        import javax.net.ssl.SSLSession;
        import javax.net.ssl.SSLSocketFactory;
        import javax.net.ssl.TrustManager;
        import javax.net.ssl.X509TrustManager;
    
        public class WSImportSSLByPass {
    
            public static void main(String[] args) throws Throwable{
                configureBypassSSL();
                com.sun.tools.internal.ws.WsImport.main(args);
            }
    
            private static void configureBypassSSL() throws NoSuchAlgorithmException,
                    KeyManagementException {
                SSLContext ssl_ctx = SSLContext.getInstance("SSL");
                TrustManager[] trust_mgr = get_trust_mgr();
                ssl_ctx.init(null, // key manager
                        trust_mgr, // trust manager
                        new SecureRandom()); // random number generator
                SSLSocketFactory sf = ssl_ctx.getSocketFactory();
    
                HttpsURLConnection.setDefaultSSLSocketFactory(sf);
                HttpsURLConnection.setDefaultHostnameVerifier(new DummyHostVerifier());
            }
    
            private static TrustManager[] get_trust_mgr() {
                TrustManager[] certs = new TrustManager[] { new X509TrustManager() {
                    public X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }
    
                    public void checkClientTrusted(X509Certificate[] certs, String t) {
                    }
    
                    public void checkServerTrusted(X509Certificate[] certs, String t) {
                    }
                } };
                return certs;
            }
        }
        class DummyHostVerifier implements HostnameVerifier {
    
            public boolean verify(String name, SSLSession sess) {
                return true;
            }
        }
    

    【讨论】:

    • 这对我很有帮助。谢谢,它为我节省了很多时间。
    【解决方案2】:

    如果是 2 次 ssl 握手,我们可以像这样修改 WSImportSSLByPass 类

        import com.sun.tools.internal.ws.WsImport;
    
    public class OCBWSImport {
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) throws Throwable {
            // TODO code application logic here
            //System.setProperty("javax.net.ssl.trustStore", "C:\\Program Files\\Java\\jdk1.8.0_131\\jre\\lib\\security\\cacerts");
            //System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
            //System.setProperty("javax.net.ssl.keyStoreType", "pkcs12");
    
            //Certificate for 2-way handshake
            System.setProperty("javax.net.ssl.keyStore", "D:\\tuanpa\\yourp12file.p12");
            System.setProperty("javax.net.ssl.keyStorePassword", "password of p12 file");
    
            //Hostname checking bypass
            javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
                    new javax.net.ssl.HostnameVerifier() {
    
                public boolean verify(String hostname,
                        javax.net.ssl.SSLSession sslSession) {
                    //return hostname.equals("192.168.1.10");
                    return true;
                }
            });
            WsImport.main(args);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      • 1970-01-01
      相关资源
      最近更新 更多