繁体   English   中英

如何在Java中禁用证书验证

[英]How to disable certificate validation in java

我需要禁用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)

“修复程序”和异常看起来无关:该修复程序禁用客户端对服务器证书的验证,而异常表示服务器认为客户端无权访问该URL。

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

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

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

就像其他人提到的那样,错误401表示您确实建立了SSL连接,发送了请求并被送回了此401错误。 因此,您的SSL代码很好。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM