【问题标题】:Java ignore certificate validationJava 忽略证书验证
【发布时间】:2011-07-13 16:04:09
【问题描述】:

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

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

【问题讨论】:

  • 您是否设法忽略了axis2的证书?约西普

标签: java ssl-certificate


【解决方案1】:

org.apache.axis2.AxisFault 表示您使用的是 Axis 2,而 Axis 2 不使用 HttpsURLConnection 进行 HTTP(S) 连接,而是使用 Apache HttpClient(据我所知是 3.x),所以 @ 987654325@ 在那里无效。

您可以查看this answer,了解如何为 Axis 2 设置 SSLContext,更具体地说,此文档:http://axis.apache.org/axis2/java/core/docs/http-transport.html#httpsupport

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

【讨论】:

  • 啊,所以 Axis2 不使用 HttpsUrlConnection,这解释了很多!呃......我仍然不确定如何在这里设置 SSLContext,有点庞大的文档数量,我遇到了麻烦,因为不知何故我觉得它应该是某个地方的简单开关。
  • 确实,将SSLContext.setDefault(sc)SSLContext.getInstance("TLS")(或SSLContext.getInstance("SSL")?)的值相加似乎在这里有效。
【解决方案2】:

这是一个较老的问题,但我偶然发现了它,它使我朝着正确的方向前进。通过设置参数,我可以在没有有效客户端证书的情况下访问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 服务客户端之前执行此操作。这不是我在生产中会做的事情,而是作为对不安全服务器的快速破解,为我解决了问题。

【讨论】:

    猜你喜欢
    • 2011-11-16
    • 2013-10-16
    • 2016-01-25
    • 2013-08-06
    • 1970-01-01
    • 2012-08-30
    • 2016-08-04
    • 2016-04-23
    • 2020-10-26
    相关资源
    最近更新 更多