Java忽略证书验证

时间:2011-07-13 16:04:10

标签: java ssl-certificate

我正在尝试创建一些连接到自签名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) {
  }
}

但仍有同样的问题。这是怎么回事?

2 个答案:

答案 0 :(得分:10)

org.apache.axis2.AxisFault表示您正在使用Axis 2,而Axis 2不使用HttpsURLConnection建立HTTP(S)连接,但Apache HttpClient(据我所知3.x) ),所以HttpsURLConnection.setDefaultSSLSocketFactory(...)在那里没有效果。

您可以查看有关为Axis 2设置SSLContext的{​​{3}},更具体地说,请参阅此文档:this answer

(或者,您可以通过在Java 6中引入SSLContext来设置默认SSLContext.setDefault(...)。在您的默认SSL上下文中禁用证书验证显然不是一个好主意。真实的应用。)

答案 1 :(得分:3)

这是一个较老的问题,但我偶然发现了它,它在某种程度上使我有了正确的方向。我可以通过设置参数来访问axis2中没有有效客户端证书的https网址:

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服务客户端之前执行此操作。这不是我在制作中会做的事情,而是作为一个快速破解一个不安全的服务器,为我做了诀窍。