java - 使用假(开发)证书通过 SSL 导入 WSImport

标签 java ssl https webservice-client wsimport

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

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

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

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

最佳答案

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

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

解决方法(假设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;
        }
    }

关于java - 使用假(开发)证书通过 SSL 导入 WSImport,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29922479/

相关文章:

php - XAMPP 7.0.23 上的 SSL 错误 : SEC_ERROR_UNKNOWN_ISSUER

iis - 错误 404。使用 IIS7.5 URL 从 HTTP 重定向到 HTTPS

ssl - IPFS COR 错误

java - java中的动态数组声明

java - 复杂正则表达式

c - libcurl-NSS 使用 tls :SSL CA cert (path? 访问权限构建 Imap?)windows

ios - API 调用给出协议(protocol)错误

带有自定义证书的 Android https 连接

java - logback 每个记录器配置不起作用

java - 无法通过java连接到SQL Server 2014