Java忽略证书验证

6

我正在尝试创建一些样例Java项目,以连接到一个自签名的HTTPS服务器。我似乎无法让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) {
  }
}

但仍然存在相同的问题。这是怎么回事?

你是否已经成功地在Axis2中忽略证书?Josip - user1202016
2个回答

10

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

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


啊,所以Axis2不使用HttpsUrlConnection,这就解释了很多问题!嗯...我仍然不确定如何在这里设置SSLContext,文档量有点大,让我感到有些不知所措,因为我觉得应该有一个简单的开关。 - Jay Sullivan
实际上,在这里添加SSLContext.setDefault(sc),并将其值设置为SSLContext.getInstance("TLS")(或SSLContext.getInstance("SSL")?)似乎可以起作用。 - sehe

4

这是一个较旧的问题,但我偶然发现它,它让我朝正确的方向前进了一步。通过设置以下参数,我可以在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服务客户端之前,请确保这样做。这并不是我在生产环境中会做的事情,但对于一个未安全保护的服务器来说,这是一个快速的解决办法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接