2015-04-28 3 views
1

Недавно я потратил пару часов, пытаясь заставить WSImport работать на веб-сервисе, размещенном поверх HTTPS, с поддельным сертификатом (развертывание dev).WSImport через SSL с поддельным (dev) сертификатом

Я попытался использовать версию Windows wsimport.exe, из Java 8 jdk.

Я указал опцию -XdisableSSLHostnameVerification, но он продолжал жаловаться на неправильный сертификат. Это верно, сертификат недействителен, но в среде dev он должен быть приемлемым.

Я не нашел простой способ заставить wsimport пропустить проверку сертификата.

ответ

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; 
     } 
    } 
+0

Это действительно помогло мне. Спасибо, и это сэкономило много времени для меня. –

1

В случае 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); 
    } 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^