是否有用于禁用证书验证的 java 设置? [复制]

Posted

技术标签:

【中文标题】是否有用于禁用证书验证的 java 设置? [复制]【英文标题】:Is there a java setting for disabling certificate validation? [duplicate] 【发布时间】:2011-06-07 11:34:18 【问题描述】:

我在尝试启动应用程序时收到此错误:

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

应用程序位于封闭网络后面,永远无法访问 oscp.thawte.com。是否有可以禁用此功能的 java 设置?

【问题讨论】:

【参考方案1】:

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

【讨论】:

我应该在哪里执行这个? 它是JVM的命令行参数。也可以通过编程方式设置***.com/questions/5189914/setting-system-property 使用 OpenJDK 6 这对我不起作用。 (可能是特定于太阳的) 在 OpenJDK 代码中引用了 hg.openjdk.java.net/jdk7/jdk7/jdk/file/37a05a11f281/src/share/… 尝试检查您使用的是哪个 TrustManager。 不适用于我的 Java 8。我在代码中使用了 System.setProperty("com.sun.net.ssl.checkRevocation", "false")。该属性确实已设置,但没有任何效果。【参考方案2】:

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

完整示例:Fix certificate problem in HTTPS

【讨论】:

这应该是公认的答案。接受的答案中提到的属性在许多 JVM 上都不起作用。【参考方案3】:

在 Axis 网络服务中,如果您必须禁用证书检查,请使用以下代码:

AxisProperties.setProperty("axis.socketSecureFactory","org.apache.axis.components.net.SunFakeTrustSocketFactory");

【讨论】:

【参考方案4】:

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

示例:

    从 cli 更改 dir 到 jre\bin

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

    从所需服务器下载并保存所有证书链。

    添加证书(在需要删除文件“..\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

【讨论】:

【参考方案5】:

在我的 Mac 上,我确信我不会在特定站点以外的任何地方允许 java,我能够使用 Preferences->Java 来调出 Java 控制面板并关闭检查。如果 DLink 修复了他们的证书,我会重新打开它。

【讨论】:

我该如何打开这个文件?【参考方案6】:

除了上面的答案。您可以通过实现 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);

但是这对于生产来说不是一个好的做法。

How to disable SSL certificat validation in Java 上的这个示例包含一个可以复制到项目中的实用程序类。

【讨论】:

第一次尝试就成功了。谢谢!! 你能告诉我你使用的是什么版本的apache客户端吗?这不适用于更高版本,例如版本 4.5.13 你能告诉我你用的是什么版本的java,什么版本的Apache Client。 @AntonCavanaugh 在撰写此答案时,我使用的是 java 8。【参考方案7】:

这很简单。在我看来这是对每个人来说最好的方法

       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。

以上是关于是否有用于禁用证书验证的 java 设置? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 hsqldb 中禁用主机名验证

AWS证书管理器DNS验证方法不适用于API

Node.js没有主机名验证的TLS连接

通过 CLI 针对 Java 证书存储验证证书

尽管我明确设置了一个不验证任何证书的信任管理器,但为啥 Java 会尝试验证证书路径?

启用证书身份验证时获取 401.2