Java忽略证书验证

Java忽略证书验证,java,ssl-certificate,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.SSLHa

我正在尝试创建一些连接到自签名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
,更具体地说,本文档:


(或者,您可以使用Java 6中引入的
SSLContext.setDefault(…)
设置默认的
SSLContext
。在实际应用程序中禁用默认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服务客户端之前执行此操作。这不是我在生产中会做的事情,但作为一个不安全服务器的快速黑客,它为我做到了这一点。

Ahh,所以Axis2不使用HttpsUrlConnection,这解释了很多!呃…我仍然不知道如何在这里设置SSLContext,有点像是大量的文档,我有点麻烦,因为不知怎么的,我觉得它应该是一个简单的开关。实际上,添加
SSLContext.setDefault(sc)
,值为
SSLContext.getInstance(“TLS”)
(或
SSLContext.getInstance(“SSL”)
?)似乎在此处工作。您是否已设法忽略axis2的证书?约西普