【问题标题】:ClientRequest accept all certificatesClientRequest 接受所有证书
【发布时间】:2014-05-21 21:12:20
【问题描述】:

我正在使用 ClientRequest 库执行“GET”请求,但是遇到了证书错误:

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
    at sun.security.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:397) [jsse.jar:1.7.0_40]
    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128)
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:572)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)
    at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294)
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:640)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:479)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
    at org.jboss.resteasy.client.core.executors.ApacheHttpClient4Executor.execute(ApacheHttpClient4Executor.java:182) [resteasy-jaxrs-2.3.6.Final-redhat-1.jar:2.3.6.Final-redhat-1]

由于这只是一个测试环境,我希望能够忽略或接受所有通过 https 的证书。 (我知道这违背了 ssl 的目的。)非常感谢任何指向正确方向的指针!

    ClientRequest request = new ClientRequest(someURL.toString());
    ClientResponse<SomeClass> response = null;
    response = request.get(SomeClass.class);
    response.getEntity();

【问题讨论】:

  • @AlexandreSantos,为什么建议忽略证书错误?证书的存在是有原因的。
  • 阅读帖子:由于这只是一个测试环境,我希望能够忽略或接受所有通过 https 的证书。
  • @AlexandreSantos,很公平,但即使在测试环境中,最好使用实际证书进行测试。至少,不安全的代码不会错误地进入生产环境(很容易忘记删除隐藏错误的代码,否则这些错误对于在生产环境中标记很重要)。

标签: java ssl


【解决方案1】:

由于您使用的是 Apache HTTP 客户端,其证书默认情况下不受信任,因此此异常与 SSLSocket 的大多数其他用途中的“javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed”具有相同的原因(请参阅this answer for details):本质上,这表明您的证书不受信任。

不要忽略错误(通过添加特定代码来绕过任何证书验证,当您接近发布截止日期时您可能会忘记的代码),将您的自定义证书导入您的信任库。例如,创建与 JRE 捆绑的 cacerts 文件的本地副本,使用 keytool 导入自定义证书,并在启动 JVM 时将 javax.net.ssl.trustStore 系统属性(和相关属性)指向该文件。

【讨论】:

  • 没错。不要掉入“仅供测试”的陷阱。你应该测试的是真正的系统,而不是一些杂物。如果您不在应用程序中构建安全漏洞,即使您忘记了,也无法部署它们。
猜你喜欢
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
相关资源
最近更新 更多