wsimport-over-ssl和假(dev)证书

zxlwwiss  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(478)

最近,我花了几个小时试图让wsimport在通过https托管的web服务上工作,并使用假证书(dev deployment)。
我试着用windows版本的 wsimport.exe ,来自Java8JDK。
我指定了选项 -XdisableSSLHostnameVerification ,但它一直在抱怨错误的证书。确实,证书是无效的,但在dev环境中它应该是可以接受的。
我没有找到使wsimport跳过证书检查的简单方法。

xggvc2p6

xggvc2p61#

最后我得到了一个解决方案,使用 Package 类。
我认为分享解决方案是有意义的。希望它能节省一些人的时间,以更好的目的。
解决方案(假设java安装在 c:\Program Files\Java\jdk1.8.0_40 ):
如何编译 "c:\Program Files\Java\jdk1.8.0_40\bin\javac" -cp "c:\Program Files\Java\jdk1.8.0_40\lib\tools.jar" WSImportSSLByPass.java 如何使用 "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% 代码
投入 WSImportSSLByPass.java ```
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;

  1. import javax.net.ssl.HostnameVerifier;
  2. import javax.net.ssl.HttpsURLConnection;
  3. import javax.net.ssl.SSLContext;
  4. import javax.net.ssl.SSLSession;
  5. import javax.net.ssl.SSLSocketFactory;
  6. import javax.net.ssl.TrustManager;
  7. import javax.net.ssl.X509TrustManager;
  8. public class WSImportSSLByPass {
  9. public static void main(String[] args) throws Throwable{
  10. configureBypassSSL();
  11. com.sun.tools.internal.ws.WsImport.main(args);
  12. }
  13. private static void configureBypassSSL() throws NoSuchAlgorithmException,
  14. KeyManagementException {
  15. SSLContext ssl_ctx = SSLContext.getInstance("SSL");
  16. TrustManager[] trust_mgr = get_trust_mgr();
  17. ssl_ctx.init(null, // key manager
  18. trust_mgr, // trust manager
  19. new SecureRandom()); // random number generator
  20. SSLSocketFactory sf = ssl_ctx.getSocketFactory();
  21. HttpsURLConnection.setDefaultSSLSocketFactory(sf);
  22. HttpsURLConnection.setDefaultHostnameVerifier(new DummyHostVerifier());
  23. }
  24. private static TrustManager[] get_trust_mgr() {
  25. TrustManager[] certs = new TrustManager[] { new X509TrustManager() {
  26. public X509Certificate[] getAcceptedIssuers() {
  27. return null;
  28. }
  29. public void checkClientTrusted(X509Certificate[] certs, String t) {
  30. }
  31. public void checkServerTrusted(X509Certificate[] certs, String t) {
  32. }
  33. } };
  34. return certs;
  35. }
  36. }
  37. class DummyHostVerifier implements HostnameVerifier {
  38. public boolean verify(String name, SSLSession sess) {
  39. return true;
  40. }
  41. }
展开查看全部
6yoyoihd

6yoyoihd2#

在双向ssl握手的情况下,我们可以这样修改wsimportsslbaypass类

  1. import com.sun.tools.internal.ws.WsImport;
  2. public class OCBWSImport {
  3. /**
  4. * @param args the command line arguments
  5. */
  6. public static void main(String[] args) throws Throwable {
  7. // TODO code application logic here
  8. //System.setProperty("javax.net.ssl.trustStore", "C:\\Program Files\\Java\\jdk1.8.0_131\\jre\\lib\\security\\cacerts");
  9. //System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
  10. //System.setProperty("javax.net.ssl.keyStoreType", "pkcs12");
  11. //Certificate for 2-way handshake
  12. System.setProperty("javax.net.ssl.keyStore", "D:\\tuanpa\\yourp12file.p12");
  13. System.setProperty("javax.net.ssl.keyStorePassword", "password of p12 file");
  14. //Hostname checking bypass
  15. javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
  16. new javax.net.ssl.HostnameVerifier() {
  17. public boolean verify(String hostname,
  18. javax.net.ssl.SSLSession sslSession) {
  19. //return hostname.equals("192.168.1.10");
  20. return true;
  21. }
  22. });
  23. WsImport.main(args);
  24. }
  25. }
展开查看全部

相关问题