使用假(dev)证书通过SSL进行WSImport

Dmi*_*sky 1 java ssl https webservice-client wsimport

最近,我花了几个小时试图让WSImport处理通过HTTPS托管的Web服务,使用伪证书(开发部署).

我试过用wsimport.exeJava 8 jdk的windows版本.

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

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

Dmi*_*sky 5

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

我认为分享解决方案是有意义的.希望它可以节省一些人的时间用于更好的目的.

解决方案(假设安装了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;
        }
    }
Run Code Online (Sandbox Code Playgroud)