是否有Java设置可以禁用证书验证?

95

当我尝试启动一个应用程序时,我收到了这个错误:

Sun.security.validator.ValidatorException: PKIX path validation failed: 
java.security.cert.CertPathValidatorException:  java.net.UnknownHostException:oscp.thawte.com

这个应用程序在一个封闭的网络中,永远无法访问 oscp.thawte.com。是否有一种Java设置可以禁用它?

7个回答

77

-Dcom.sun.net.ssl.checkRevocation=false


6
我该在哪里执行这个? - nyanev
2
它是JVM的命令行参数。你也可以以编程方式设置它。https://dev59.com/O2435IYBdhLWcg3w0Tvc - MK.
1
好的,它在OpenJDK代码中被引用了。请尝试检查您正在使用哪个TrustManager。代码链接为:http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/37a05a11f281/src/share/classes/sun/security/ssl/X509TrustManagerImpl.java - MK.
31
对我来说,无法在Java 8中工作。我在我的代码中使用了System.setProperty(“com.sun.net.ssl.checkRevocation”,“false”)。该属性确实被设置了,但没有任何效果。 - Kumar Vaibhav
1
我正在使用的是openjdk版本“1.8.0_292” OpenJDK运行时环境(构建1.8.0_292-b10) 这个选项似乎不起作用。 - HoaPhan
显示剩余4条评论

23

虽然不是一个设置,但您可以覆盖默认的TrustManager和HostnameVerifier以接受任何内容。这并不是一种安全的方法,但在您的情况下,它可能是可接受的。


1
这应该是被接受的答案。在被接受的答案中提到的属性在许多JVM上都没有生效。 - Kumar Vaibhav

18

除了上面的答案,您还可以通过实现TrustManager程序来进行编程操作:

TrustManager[] trustAllCerts = new TrustManager[] {
        new X509TrustManager() {
          public java.security.cert.X509Certificate[] getAcceptedIssuers() {
           return null;
          }
          @Override
          public void checkClientTrusted(X509Certificate[] arg0, String arg1)
           throws CertificateException {}

          @Override
          public void checkServerTrusted(X509Certificate[] arg0, String arg1)
            throws CertificateException {}
          }
     };

  SSLContext sc=null;
  try {
   sc = SSLContext.getInstance("SSL");
  } catch (NoSuchAlgorithmException e) {
   e.printStackTrace();
  }
  try {
   sc.init(null, trustAllCerts, new java.security.SecureRandom());
  } catch (KeyManagementException e) {
   e.printStackTrace();
  }
  HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
  // Create all-trusting host name verifier
  HostnameVerifier validHosts = new HostnameVerifier() {
  @Override
  public boolean verify(String arg0, SSLSession arg1) {
   return true;
  }
  };
  // All hosts will be valid
  HttpsURLConnection.setDefaultHostnameVerifier(validHosts);

然而,这不是生产环境下的良好实践。

本例在如何在Java中禁用SSL证书验证中包含一个实用类,您可以将其复制到您的项目中。


3
第一次尝试就成功了。谢谢! - JRichardsz
你能告诉我你正在使用哪个版本的Apache客户端吗?这不适用于较新的版本,例如4.5.13版本。 - Anton Cavanaugh
你能告诉我你正在使用的Java版本以及Apache客户端版本吗? - Anton Cavanaugh
在回答时,我使用的是Java 8。 - Mehdi

10

使用java软件分发中的cli实用程序 keytool 导入(并信任!)所需的证书

示例:

  1. 从cli更改目录到 jre\bin

  2. 检查keystore(在jre\bin目录中找到的文件)
    keytool -list -keystore ..\lib\security\cacerts
    输入密钥库密码:changeit

  3. 下载并保存所有所需服务器的证书链。

  4. 添加证书(需要先删除文件“..\lib\security\cacerts”上的“只读”属性) keytool -alias REPLACE_TO_ANY_UNIQ_NAME -import -keystore ..\lib\security\cacerts -file "r:\root.crt"

我偶然发现了这样一个简单的提示。 其他解决方案需要使用InstallCert.Java和JDK

来源:http://www.java-samples.com/showtutorial.php?tutorialid=210


3
在我的Mac上,我确定除了特定的网站,我不会允许Java运行。我可以使用“偏好设置-> Java”来打开Java控制面板,并关闭检查。如果DLink修复了他们的证书,我会重新打开它。

Java control panel - Advanced


1
我该怎么打开这个文件? - lordvidex
1
我怎样才能在MacOS Monterey上实现这个功能?我相信没有Java控制面板。 - Mohamed Niyaz Sirajudeen

2
在Axis webservice中,如果您需要禁用证书检查,则使用以下代码:
AxisProperties.setProperty("axis.socketSecureFactory","org.apache.axis.components.net.SunFakeTrustSocketFactory");

-6

这非常简单。在我看来,这是每个人的最佳选择。

       Unirest.config().verifySsl(false);
       HttpResponse<String> response = null;
       try {
           Gson gson = new Gson();
           response = Unirest.post("your_api_url")
                   .header("Authorization", "Basic " + "authkey")
                   .header("Content-Type", "application/json")
                   .body("request_body")
                   .asString();
           System.out.println("------RESPONSE -------"+ gson.toJson(response.getBody()));
       } catch (Exception e) {
           System.out.println("------RESPONSE ERROR--");
           e.printStackTrace();
       }
   }

你确定这会有帮助吗?我不确定海报是否在尝试自己进行ws调用。 - Stan

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