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

忽略Apache HTTPClient 4.5中的自签名证书

耿俊彦
2023-03-14
问题内容

我正在尝试 接受所有证书,和/或 使用 Apache HTTPClient 4.5版 接受自签名证书
(此处为教程链接)

我一直在从SO上的大量帖子中寻找解决此问题的方法。到目前为止,它们都没有起作用。

我不断收到此错误: Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

Apache文件:

  • Apache v4.5教程
  • SSL / TLS定制
  • Apache有版本3 的指南,但没有版本4的指南。

请注意,在所有这些示例中,我还传递了我之前定义的cookie存储和代理凭据提供程序。这些正在工作,我只是想添加SSL支持。

使用创建我自己的ssl上下文,SSLContextBuilder并使用信任所有自签名策略TrustSelfSignedStrategy

SSLContextBuilder sshbuilder = new SSLContextBuilder();
sshbuilder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sshbuilder.build());

CloseableHttpClient httpclient = HttpClients.custom()
    .setDefaultCredentialsProvider(credsProvider)
    .setDefaultCookieStore(cookieStore)
    .setSSLSocketFactory(sslsf)
    .build();

结果 :没用。得到Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

尝试#2

与上述相同,但添加一个 PoolingHttpClientConnectionManager

SSLContextBuilder builder = new SSLContextBuilder();
builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build(),SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
        .register("http", new PlainConnectionSocketFactory())
        .register("https", sslsf)
        .build();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
cm.setMaxTotal(2000);//max connection

CloseableHttpClient httpclient = HttpClients.custom()
    .setDefaultCredentialsProvider(credsProvider)
    .setDefaultCookieStore(cookieStore)
    .setSSLSocketFactory(sslsf)
    .setConnectionManager(cm)
    .build();

结果 :没用。得到Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

尝试#3

只需通过覆盖即可接受所有证书TrustStrategy(不建议这样做)

SSLContextBuilder builder = new SSLContextBuilder();
builder.loadTrustMaterial(null, new TrustStrategy() {
    @Override
    public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        return true;
    }
});
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build(),
    SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

CloseableHttpClient httpclient = HttpClients.custom()
    .setDefaultCredentialsProvider(credsProvider)
    .setDefaultCookieStore(cookieStore)
    .setSSLSocketFactory(sslsf)
    .build();

结果 :没用。得到Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

尝试#4

我从这个答案中发现了一些有用的东西:

从版本4.5开始,HttpClient默认禁用SSLv3协议版本

这是他给的解决方案:

SSLContext sslcontext = SSLContexts.createSystemDefault();
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
        sslcontext, new String[] { "TLSv1", "SSLv3" }, null,
        SSLConnectionSocketFactory.getDefaultHostnameVerifier());

Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
        .register("http", PlainConnectionSocketFactory.INSTANCE)
        .register("https", sslConnectionSocketFactory)
        .build();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry);

httpclient = HttpClients.custom()
    .setDefaultCredentialsProvider(credsProvider)
    .setDefaultCookieStore(cookieStore)
    .setSSLSocketFactory(sslConnectionSocketFactory)
    .setConnectionManager(cm)
    .build();

结果 :没用。得到Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake


问题答案:

在使用自签名证书的情况下,上述方法之一应该可行,但是很奇怪的是,在所有方法中您都遇到了相同的例外。

我感觉在客户端或服务器不接受SSL会话建立或握手协议期间。

最好的解决方案是调试应用程序。

如果是tomcat,请在setenv.sh或setenv.bat文件中添加 **-Djavax.net.debug = all** ,然后重新启动服务器。

或者您可以按照本教程进行操作。

连接到SSL时,OP仅需要更改端口:

//For HTTPS
HttpHost httpstarget = new HttpHost("mysite.com", 443, "https");

//For HTTP
HttpHost httptarget = new HttpHost("mysite.com", 80, "http");


 类似资料:
  • null 忽略Apache HttpClient 4.3中的SSL证书 如何忽略Apache HttpClient 4.0中的SSL证书错误 使用Java忽略SSL证书错误 在使用Spring进行开发时需要信任所有证书 如何使用Apache HttpClient处理无效的SSL证书? 请注意,在所有这些示例中,我还传递了一个cookie存储区和一个我前面定义的代理凭据提供者。这些是工作的,我只是试

  • 问题内容: 给我 有没有办法禁用认证验证? 我正在使用Gitlab 8.13.1和gitlab-ci-multi-runner 1.11.2。 问题答案: 根据Wassim的答案以及有关tls- 自签名和自定义CA签名证书的gitlab文档 ,如果您不是gitlab服务器的管理员,而是运行者(以及运行者)的管理员,则可以节省一些时间以root身份运行): 更新1: 证书必须是正确位置的绝对路径。

  • 问题内容: 我正在使用Jersey客户端库针对在jboss上运行的rest服务运行测试。我使用自签名证书在服务器(在本地主机上运行)上设置了https。 但是,每当我使用https url运行测试时,都会出现以下错误: 我知道这是因为我的自签名证书不在Java密钥库中。有什么办法可以让我不检查ssl证书的有效性,而直接使用它呢? 这段代码只能在测试服务器上运行,因此,我不想在每次设置新的测试服务器

  • 问题内容: 我正在开发一个登录到本地无线路由器(Linksys)的小应用程序,但是我遇到了路由器的自签名ssl证书问题。 我运行wget 192.168.1.1并得到: 在节点中,捕获的错误是: 我当前的示例代码是: 我如何才能使node.js等效于“ –no-check-certificate”? 问题答案: 便宜又不安全的答案: 加 在代码中,调用之前 在此问题中回答了一种更安全的方法(上述解

  • 我当前的示例代码是: 我如何让node.js执行“--no-check-certificate”的等效操作?

  • 这个问题似乎已经被问到和回答了,但到目前为止,我遇到的每一个解决方案都没有帮助。我正在编写一个PowerShell脚本来运行一些RESTAPI以获取使用信息。我的脚本在尝试与服务器通信时立即中断。为了测试起见,我正在执行一个非常简单的命令: 它返回此错误: 我可以运行相同的命令,但与URLgoogle.com,我得到一个有效的返回,所以我知道命令一般来说是工作。 如果我在服务器本身上运行curl等