是否有用于禁用证书验证的java设置?

时间:2011-01-11 22:03:56

标签: java ssl-certificate

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

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

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

7 个答案:

答案 0 :(得分:43)

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

答案 1 :(得分:13)

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

完整示例:Fix certificate problem in HTTPS

答案 2 :(得分:5)

使用java软件分发中的cli实用程序 keytool 导入(以及 trust!)所需的证书

示例:

  1. 从cli change dir改为jre \ bin

  2. 检查密钥库(在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”

  5. 不小心我发现了这么简单的小费。 其他解决方案需要使用InstallCert.Java和JDK

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

答案 3 :(得分:1)

MK给出的答案很好:)

在Axis webservice中,如果必须禁用证书检查,请使用以下代码:

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

答案 4 :(得分:1)

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

Java control panel - Advanced

答案 5 :(得分:1)

除了上面的答案。您可以通过实现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上的该示例包含一个可以在项目中复制的实用程序类。

答案 6 :(得分:-1)

这很简单。我认为这是每个人的最佳方法

       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();
       }
   }