【问题标题】:How to disable certificate validation in java如何在java中禁用证书验证
【发布时间】:2012-10-28 01:43:42
【问题描述】:

我只需要禁用 Java 证书验证以进行测试。所以我理解风险。我使用了以下教程:http://www.rgagnon.com/javadetails/java-fix-certificate-problem-in-HTTPS.html

所以代码是:

import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.net.URLConnection;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;

public class Cert {
  public static void main(String[] args) throws Exception {
    /*
     *  fix for
     *    Exception in thread "main" 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
     */
    TrustManager[] trustAllCerts = new TrustManager[] {
       new X509TrustManager() {
          public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
          }

          public void checkClientTrusted(X509Certificate[] certs, String authType) {  }

          public void checkServerTrusted(X509Certificate[] certs, String authType) {  }

       }
    };

    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

    // Create all-trusting host name verifier
    HostnameVerifier allHostsValid = new HostnameVerifier() {
        public boolean verify(String hostname, SSLSession session) {
          return true;
        }
    };
    // Install the all-trusting host verifier
    HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
    /*
     * end of the fix
     */

    URL url = new URL("https://www.nakov.com:2083/");
    URLConnection con = url.openConnection();
    Reader reader = new InputStreamReader(con.getInputStream());
    while (true) {
      int ch = reader.read();
      if (ch==-1) {
        break;
      }
      System.out.print((char)ch);
    }
      }
    }

我仍然收到以下错误。任何机构都可以帮忙吗?

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 401 for URL: https://www.nakov.com:2083/
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1615)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
    at MainProject.Cert.main(Cert.java:56)

【问题讨论】:

  • 我有类似的代码,但是当我运行我的应用程序时,它给了我错误提示:java.lang.classcastexception: java.lang.string cannot be cast to java.lang.boolean。我相信这个错误来自 verify(String, SSLSession) 方法,它返回一个布尔值,但由于某种原因在我的情况下它返回一个空值?有什么想法吗?

标签: java ssl network-programming certificate ssl-certificate


【解决方案1】:

“修复”和异常似乎无关:修复禁用客户端验证服务器证书,而异常表明服务器认为客户端无权访问该 URL。

【讨论】:

  • 但是当我将 URL 添加到浏览器时,我可以访问它。唯一的事情是 Firefox 警告我不要使用自签名证书。
  • 然后我会检查 firefox 发送的 http 请求(例如使用 firebug 的网络选项卡)以发现差异(cookie?用户代理标头?不同的 http-proxy?...? )。
【解决方案2】:

这不会解决问题。 401 是通过 HTTPS 和 SSL 传输的,因此证书运行良好。

无论如何,我强烈建议您不要这样做。您不希望在测试和生产中执行不同的代码。测试代码很有可能会泄漏到生产环境中并危及安全性。而且测试不安全的代码是没有意义的。

【讨论】:

    【解决方案3】:

    不必费心在您的代码中禁用它,您只需将证书添加到您的测试机信任库,并 100% 确保您不会在禁用检查的情况下发布构建。

    【讨论】:

    • 我需要以编程方式执行此操作。
    • @JuryA 为什么?为什么要编写有条件不安全的代码?不要这样做。
    • 我也必须这样做,因为它是我为多个客户端编写的软件,它们将使用所有不同的证书连接到他们自己的服务器。我并不真正关心证书,因为该链接是完全可信的。
    • 这个论点的双方实际上都是正确的——虽然确保证书有效是正确的,但开发人员将不得不不断地管理证书——如果只是一对很简单,但是当它激增时会发生什么?当 2-way SSL 发挥作用时会发生什么?客户端证书也必须安装在服务器上......这可能会失控。另一方面,如果有一个部署了真正证书的集成环境,并且有针对新部署的自动化测试,那么每个人都是赢家。
    【解决方案4】:

    正如其他人所提到的,错误 401 意味着您确实建立了 SSL 连接,发送了您的请求并被返回了这个 401 错误。所以你的 SSL 代码没问题。

    当您在浏览器中打开此页面时,您是否收到用户名/密码提示?也许自动登录?如果是这种情况,我会说您的代码缺少此基本身份验证或类似内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多