当前位置: 首页 > 面试题库 >

忽略Java的SSL证书错误

郝冥夜
2023-03-14
问题内容

Apache Http客户端。您可以在此处查看相关代码:

String url = "https://path/to/url/service";
HttpClient client = new HttpClient();
PostMethod method = new PostMethod(url);

// Test whether to ignore cert errors
if (ignoreCertErrors){
  TrustManager[] trustAllCerts = new TrustManager[]{
    new X509TrustManager(){
      public X509Certificate[] getAcceptedIssuers(){ return null; }
      public void checkClientTrusted(X509Certificate[] certs, String authType) {}
      public void checkServerTrusted(X509Certificate[] certs, String authType) {}
    }
  };

  try {
    SSLContext sslContext = SSLContext.getInstance("SSL");
    sslContext.init(null, trustAllCerts, new SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
  } catch (Exception e){
    e.printStackTrace();
  }
}

try {

  // Execute the method (Post) and set the results to the responseBodyAsString()
  int statusCode = client.executeMethod(method);
  resultsBody = method.getResponseBodyAsString();

} catch (HttpException e){
  e.printStackTrace();
} catch (IOException e){
  e.printStackTrace();
} finally {
  method.releaseConnection();
}

这是每个人都用来忽略SSL证书错误的方法(仅将其设置为登台,它将不会在生产中使用)。但是,我仍然收到以下异常/堆栈跟踪:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building unable to find valid certification path to requested target

任何提示都很好。如果我做的TrustManager错误,或者我应该以不同的方式执行HTTP Post方法,则可以选择两种方式。

谢谢!


问题答案:

首先,不要 忽略 证书错误。与他们打交道。忽略证书错误将打开与潜在MITM攻击的连接。这就像关闭烟雾报警器中的蜂鸣器一样,因为有时它会发出声音…

可以肯定的是,它仅用于测试代码,不会最终投入生产,但是我们都知道截止日期临近时会发生什么:测试代码不会显示任何错误->我们可以发货照原样。如果需要,应改为设置测试CA。制作起来并不难,而且整个过程当然也不会比引入自定义代码进行开发并将其从生产环境中删除更为困难。

您显然正在使用Apache Http Client:

HttpClient client = new HttpClient();
int statusCode = client.executeMethod(method);

但是,您正在javax.net.ssl.HttpsURLConnection使用SSLContext创建的进行初始化:

HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());

这完全独立于Apache Http Client设置。

相反,您应SSLContext按照此答案中的说明为ApacheHttp Client库设置。如果您使用的是Apache Http Client
3.x,则需要自行设置SecureProtocolSocketFactory才能使用它SSLContext(请参阅此处的示例)。值得升级到Apache
Http Client 4.x,它直接支持SSLContext

您也可以使用Pascal的答案正确导入证书。同样,如果您遵循该问题接受的答案(由Kevin回答),则您确实会忽略该错误,但这会使连接容易受到MITM攻击



 类似资料:
  • 问题内容: URL myUrl = new URL(“https://www....."); 网站的SSL证书已过期。如何避免它并使URL()工作? 问题答案: 您应该构建一个包装默认信任管理器的,捕获并忽略它。 注意:如此答案中所述,此设置是否安全在很大程度上取决于实现。特别是,它依赖于在正确检查所有其他内容之后最后执行的日期验证。 遵循这些原则的东西应该起作用: 当证书有问题时,信任管理器将抛

  • 我正在开发一个应用程序,使用rest API将其连接到数据库,我的服务器有一个SSL证书,当我试图发送请求时,从我的反应本地应用程序显示此错误msg是有办法禁用SSL验证反应原生Android。 如果有人知道,帮忙。

  • 主要内容:自签名证书错误,Maven依赖关系,接受自签名证书通常,开发人员将在本地机器上或项目的开发阶段使用自签名证书。 默认情况下,HttpClient(和Web浏览器)不会接受不可信的连接。 但是,可以配置以允许不可信的自签名证书。 注意:这是一个可能存在安全风险,因为您将其用于生产时,基本上会禁用所有的认证检查,这可通导致受到攻击。 在这个例子中,我们演示了如何忽略Apache HttpClient 4.5中的SSL / TLS证书错误。 自签名证书

  • 问题内容: 如何忽略Apache HttpClient 4.3的SSL证书(全部信任)? 我在SO上找到的所有答案都对待以前的版本,并且API更改了。 编辑: 仅用于测试目的。孩子们,不要在家(或生产中)尝试 问题答案: 以下代码可用于信任自签名证书。创建客户端时,必须使用TrustSelfSignedStrategy: 我没有故意包括:重点是允许使用自签名证书进行测试,因此您不必从证书颁发机构获

  • 问题内容: 如何绕过Apache HttpClient 4.0的无效SSL证书错误? 问题答案: 你需要使用自己的TrustManager创建SSLContext并使用此上下文创建HTTPS方案。这是代码,