簡體   English   中英

Java 忽略證書驗證

[英]Java ignore certificate validation

我正在嘗試創建一些連接到自簽名 HTTPS 服務器的示例 Java 項目。 我似乎無法讓 Java 停止嘗試驗證證書。 我不想信任這個證書,我只想完全忽略所有證書驗證; 該服務器在我的網絡內,我希望能夠運行一些測試應用程序而不用擔心證書是否有效。

java -Dcom.sun.net.ssl.checkRevocation=false HelloWorld
org.apache.axis2.AxisFault: Connection has been shutdown: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed:  sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

-Dcom.sun.net.ssl.checkRevocation=false沒有幫助。 我還嘗試添加以下代碼:

public static void DisableCertificateValidation() {
  TrustManager[] trustAllCerts = new TrustManager[]{
    new X509TrustManager() {
      public X509Certificate[] getAcceptedIssuers() { return null; }
      public void checkClientTrusted(X509Certificate[] certs, String authType) { }
      public void checkServerTrusted(X509Certificate[] certs, String authType) { }
    }
  };
  try {
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
  } catch (Exception e) {
  }
}

但仍然有同樣的問題。 這里發生了什么?

org.apache.axis2.AxisFault表示您使用的是Axis 2,Axis 2不使用HttpsURLConnection進行HTTP(S)連接,但是Apache HttpClient(據我所知是3.x),所以HttpsURLConnection.setDefaultSSLSocketFactory(...)在那里不起作用。

您可以查看有關為 Axis 2 設置SSLContext答案,更具體地說,本文檔: http://axis.apache.org/axis2/java/core/docs/http-transport.html#httpsupport

(或者,您可以使用SSLContext.setDefault(...)設置默認SSLContext ,在 Java 6 中介紹。禁用默認 SSL 上下文的證書驗證在實際應用程序中顯然不是一個好主意。)

這是一個較老的問題,但我偶然發現了它,它使我朝着正確的方向前進。 我可以通過設置參數在沒有有效客戶端證書的情況下訪問axis2中的https url:

import org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory;
import org.apache.commons.httpclient.protocol.Protocol;

EasySSLProtocolSocketFactory easySSLProtocolSocketFactory;
try {
     easySSLProtocolSocketFactory = new EasySSLProtocolSocketFactory();
     Protocol.unregisterProtocol("https");
     Protocol.registerProtocol("https", new Protocol("https",
                  (ProtocolSocketFactory) easySSLProtocolSocketFactory, 443));
}
catch (GeneralSecurityException e) {
      e.printStackTrace();
}

請務必在調用axis2 服務客戶端之前執行此操作。 這不是我在生產中會做的任何事情,但作為對我來說成功的不安全服務器的快速破解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM