问题标签 [apache-httpclient-5.x]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
893 浏览

java - 忽略 AsyncClientHttp2Multiplexing 中的自签名证书

我正在尝试使用单个客户端端点创建多个异步 HTTP 连接我已经尝试过Apache 站点中给出的多路复用示例

代码片段如下,

此示例适用于具有有效证书的站点,但如果我想尝试证书已过期/自签名的站点,则会引发以下异常

javax.net.ssl.SSLHandshakeException: 一般 SSLEngine 问题 javax.net.ssl.SSLHandshakeException: 一般 SSLEngine 问题在 sun.security.ssl.Handshaker.checkThrown(Handshaker.java:1478) 在 sun.security.ssl.SSLEngineImpl.checkTaskThrown( SSLEngineImpl.java:535) 在 sun.security.ssl.SSLEngineImpl.writeAppRecord(SSLEngineImpl.java:1214) 在 sun.security.ssl.SSLEngineImpl.wrap(SSLEngineImpl.java:1186) 在 javax.net.ssl.SSLEngine.wrap (SSLEngine.java:469) 在 org.apache.hc.core5.reactor.ssl.SSLIOSession.doWrap(SSLIOSession.java:256) 在 org.apache.hc.core5.reactor.ssl.SSLIOSession.doHandshake(SSLIOSession.java :294) 在 org.apache.hc.core5.reactor.InternalDataChannel.onIOEvent(InternalDataChannel.java:112) 在 org.apache.hc.core5.reactor.ssl.SSLIOSession.isAppInputReady(SSLIOSession.java:502) 在 org.org.apache.hc.core5.reactor.SingleCoreIOReactor.processEvents(SingleCoreIOReactor.java:173) 中的 org.apache.hc.core5.reactor 中的 apache.hc.core5.reactor.InternalChannel.handleIOEvent(InternalChannel.java:50)。 SingleCoreIOReactor.doExecute(SingleCoreIOReactor.java:123) at org.apache.hc.core5.reactor.AbstractSingleCoreIOReactor.execute(AbstractSingleCoreIOReactor.java:80) at org.apache.hc.core5.reactor.IOReactorWorker.run(IOReactorWorker.java: 44) 在 java.lang.Thread.run(Thread.java:748) 引起:javax.net.ssl.SSLHandshakeException: 一般 SSLEngine 问题在 sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 在 sun .security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1728) 在 sun.security.ssl.Handshaker.fatalSE(Handshaker.java:304) 在 sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296) 在 sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1514) 在 sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216) 在 sun.security.ssl.Handshaker.processLoop(Handshaker.java :1026) 在 sun.security.ssl.Handshaker$1.run(Handshaker.java:966) 在 sun.security.ssl.Handshaker$1.run(Handshaker.java:963) 在 java.security.AccessController.doPrivileged(Native Method ) 在 sun.security.ssl.Handshaker$DelegatedTask.run(Handshaker.java:1416) 在 org.apache.hc.core5.reactor.ssl.SSLIOSession.doRunTask(SSLIOSession.java:274) 在 org.apache.hc。 core5.reactor.ssl.SSLIOSession.doHandshake(SSLIOSession.java:331) ... 8 更多原因:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法在 sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:302) 在 sun.security.validator 的 sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:397) 上找到请求目标的有效认证路径。 Validator.validate(Validator.java:260) 在 sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) 在 sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:281) 在 sun.security.ssl .X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:136) 在 sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1501) ... 16 更多原因:sun.security.provider.certpath.SunCertPathBuilderException:无法找到有效sun.security.provider.certpath 中请求目标的认证路径。SunCertPathBuilder.build(SunCertPathBuilder.java:141) 在 sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) 在 java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) 在 sun.security .validator.PKIXValidator.doBuild(PKIXValidator.java:392) ... 22 更多

我尝试过的:我创建了一个信任所有证书的套接字工厂,并尝试在 connectionManager 中进行设置,但它创建了一个 CloseableHttpClient,我认为它不能用于异步多路复用,代码如下

请让我知道是否有任何方法或解决方法可以忽略 MinimalHttpAsyncClient 中的自签名证书。

0 投票
2 回答
590 浏览

java - HTTP2 url 在浏览器中成功加载,但在 httpclient5 中失败

我正在尝试创建一个 httpclient 5 示例,该示例使用 asynchttpclient(异步多路复用)加载 URL 我已将 tomcat 9 配置为使用 conf/server.xml 配置接受 http2 协议,如下所示

我的程序如下,

tomcat 配置在使用 h2 协议在 borwser 中加载页面时工作,但它在 httpclient 5 中失败,并出现以下异常

对此的任何帮助将不胜感激

提前致谢

在启用 tomcat 日志时,我可以看到以下内容,

org.apache.coyote.AbstractProtocol$ConnectionHandler.process 无法为协商协议创建处理器 [h2c]

当我将客户端代码更新到 java 9 时,即使这个问题也得到了解决,但是有可能使它与 java 8 一起工作。

ps:我知道 java 8 不支持 ALPN,但如果有什么方法可以让它与 java 8 一起工作,请告诉我。

0 投票
1 回答
444 浏览

java - 使用 HTTP2 和 SSL 的 httpclient5 出错(java.io.IOException:现有连接被远程主机强行关闭)

我正在编写一个使用 HttpClient 5.0 beta 的客户端来请求/加载支持 HTTP2 的 Tomcat 中的安全 URL/资源。程序如下。它取自 Apache httpclient 5 示例(除了使用 loadTrustMaterial 创建 SSL 上下文的方式外,代码完全相同)

运行代码时出现以下异常。

如果我没有在 H2RequesterBootstrap 上将设置版本策略设置为 HttpVersionPolicy.FORCE_HTTP_2,它可以工作,但在这种情况下它使用 HTTP/1.1。但我只能使用 HTTP2。

只是为了检查一下,我用 Jetty 的 HTTP2 客户端试了一下,它工作正常。但我只能使用 Apache HttpClient 5.0。

你能帮忙吗?谢谢。

0 投票
3 回答
1701 浏览

java - 无法使用 kerberos 票证缓存向 apache http 客户端 4.5 进行身份验证

我正在对经过 kerberos 身份验证的 REST 服务执行 https 请求。如果我使用密钥表,一切都很好。但是,我有一个要求,即我应该使用 kerberos 票证缓存文件,该文件是在使用密码登录工作站时创建的。

我将用 MY_DOMAINE.COM 替换域

所以,klist 显示:

像这样使用 curl 可以正常工作:

现在,让我们回到代码。我的 login.conf 是这样的:

为 kerberos 设置的我的 http 客户端的相关 java 代码是:

在此之前,我正在设置这些 java 属性:

kerberos 日志的输出是:

从 Java 配置加载

因此,在我看来,票据已被读取,但没有从中提取凭据,因为我最终收到 401。

为了使用票证,我必须对 apache http 客户端 4.5 做一些特别的事情吗?

亲切的问候

0 投票
0 回答
228 浏览

apache-httpcomponents - httpclient5-beta 中未连接端点

您好我正在尝试使用httpcomponents5 beta进行持久连接,我已经尝试了他们网站中给出的示例,代码如下,

这段代码第一次没有问题,但是当我发送后续请求时,它会抛出如下异常,

http5:: 发生异常 java.lang.IllegalStateException: Endpoint is not connected at org.apache.hc.core5.util.Asserts.check(Asserts.java:38) at org.apache.hc.client5.http.impl.nio .PoolingAsyncClientConnectionManager$InternalConnectionEndpoint.getValidatedPoolEntry(PoolingAsyncClientConnectionManager.java:497) at org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManager$InternalConnectionEndpoint.execute(PoolingAsyncClientConnectionManager.java:552) at org.apache.hc.client5.http .impl.async.MinimalHttpAsyncClient$InternalAsyncClientEndpoint.execute(MinimalHttpAsyncClient.java:405) at org.apache.hc.core5.http.nio.AsyncClientEndpoint.execute(AsyncClientEndpoint.java:81) at org.apache.hc.core5.http .nio.AsyncClientEndpoint.execute(AsyncClientEndpoint.java:114)

端点可能是什么问题,我正在强制端点存活一天,请对此有所了解

0 投票
1 回答
1582 浏览

tomcat - Tomcat 9 Http/2“错误读取请求,被忽略”

我正在使用 tomcat 9.0.5(jdk-9.0.4+11) 来处理我的请求,这些请求也启用了 Http/2 以实现持久连接,并且我的客户端也使用相同版本的 java,我需要打开到来自客户端的服务器并无限期地重用。我可以从客户端成功连接到我的服务器并发送请求(使用 requestBody 发布),但是在 3 个请求(正好 3 个)之后,服务器抛出如下异常,

org.apache.coyote.AbstractProtocol$ConnectionHandler.process 读取请求时出错,在 org.apache.coyote.http2.HpackDecoder 的 org.apache.coyote.http2.HpackDecoder.handleIndex(HpackDecoder.java:270) 中忽略了 java.lang.NullPointerException .decode(HpackDecoder.java:111) 在 org.apache.coyote.http2.Http2Parser.readHeaderPayload(Http2Parser.java:418) 在 org.apache.coyote.http2.Http2Parser.readHeadersFrame(Http2Parser.java:252) 在 org. apache.coyote.http2.Http2Parser.readFrame(Http2Parser.java:97) 在 org.apache.coyote.http2.Http2Parser.readFrame(Http2Parser.java:69) 在 org.apache.coyote.http2.Http2UpgradeHandler.upgradeDispatch(Http2UpgradeHandler. java:313) 在 org.apache.coyote.AbstractProcessorLight 的 org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)。org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754) 上的进程(AbstractProcessorLight.java:53) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 在 java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在 java.base/java.util .concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run (线程.java:844)doRun(NioEndpoint.java:1376) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.base /java.lang.Thread.run(Thread.java:844)doRun(NioEndpoint.java:1376) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.base /java.lang.Thread.run(Thread.java:844)java:61) 在 java.base/java.lang.Thread.run(Thread.java:844)java:61) 在 java.base/java.lang.Thread.run(Thread.java:844)

因此,一个连接仅对三个请求打开,之后服务器在此异常时关闭连接。

ps:我正在使用 httpclient-5(beta) 从我的客户端建立持久连接。如果 queryParam/requestBody 是静态内容,则连接保持持久。但是,如果 queryParam/requestBody 有一些动态内容(如时间戳),则连接因上述错误而关闭,我不知道 post body 中的数据与 tcp 连接之间的关系

我不能发布我的请求正文,因为它违反了我将在屏蔽所有请求参数后发布的政策,我的请求看起来像这样,

如果有人对此异常有任何想法,请提供帮助

TIA

0 投票
2 回答
3837 浏览

java - 如何从 Apache Http 客户端创建 Spring WebClient

我想从HttpComponent的 org.apache.http.client.HttpClient 创建WebClient以在异步操作中使用它。关于如何做的任何想法

0 投票
1 回答
1391 浏览

java - 使用 jdk8 加密以启用 http2 的 ALPN

我一直在搜索如何使用conscrypt-openjdk-uber-1.4.1.jar为 jdk8 实现Conscrypt SSL 提供程序,以支持ALPN与服务器建立http2(使用 apache httpclient 5)连接,因为jdk8 默认不支持 ALPN或另一个解决方案是迁移到 jdk9(或更高版本),这目前不可行,因为我们的产品严重依赖 jdk8

我一直在广泛搜索一些要实现的文档或示例,但我找不到。

我尝试将 conscrypt 提供程序作为默认值插入,我的程序将其作为默认提供程序,但仍然无法连接 http2 服务器,我的示例如下,

这个程序给出的输出为

org.apache.hc.core5.http.ConnectionClosedException:连接关闭 org.apache.hc.core5.http.ConnectionClosedException:连接在 org.apache.hc.core5.http2.impl.nio.FrameInputBuffer.read(FrameInputBuffer.java :146) 在 org.apache.hc.core5.http2.impl.nio.AbstractHttp2IOEventHandler.inputReady(AbstractHttp2IOEventHandler.java) 的 org.apache.hc.core5.http2.impl.nio.AbstractHttp2StreamMultiplexer.onInput(AbstractHttp2StreamMultiplexer.java:415) :63) 在 org.apache.hc.core5.reactor.InternalDataChannel.onIOEvent(InternalDataChannel.java:117) 在 org.apache.hc.core5.http2.impl.nio.ClientHttp2IOEventHandler.inputReady(ClientHttp2IOEventHandler.java:38) 在org.apache.hc.core5.reactor.SingleCoreIOReactor 中的 org.apache.hc.core5.reactor.InternalChannel.handleIOEvent(InternalChannel.java:50)。processEvents(SingleCoreIOReactor.java:173) at org.apache.hc.core5.reactor.SingleCoreIOReactor.doExecute(SingleCoreIOReactor.java:123) at org.apache.hc.core5.reactor.AbstractSingleCoreIOReactor.execute(AbstractSingleCoreIOReactor.java:80)在 org.apache.hc.core5.reactor.IOReactorWorker.run(IOReactorWorker.java:44) 在 java.lang.Thread.run(Thread.java:748)

如果我打印提供程序和版本,它将打印为Conscrypt 版本 1.0JDK 1.8.0_162,但仍然无法连接到 http2 端点

如果我使用 jdk9 与默认提供程序连接,相同的代码块可以完美运行,我在 conscrypt 配置中缺少什么?

任何帮助表示赞赏

提前致谢

0 投票
1 回答
356 浏览

java - 如何使用 HttpClient 5 使 Conscrypt SSL 提供程序在 Tomcat Web 应用程序中工作

我正在使用Apache HttpClient 5Conscrypt通过 SSL 执行同步 HTTP 2.0 请求,如下所示:

在单元测试中运行代码是成功的。但是,如果作为在 Tomcat v8 中运行的 Web 应用程序的一部分运行,它会在调用时引发以下异常Conscrypt.newProvider()message: java.lang.UnsatisfiedLinkError: Failed creating temp file (null)它看起来像一个特权问题。有人可以指出在这种情况下我应该配置什么来解决问题吗?

0 投票
0 回答
209 浏览

java - Apache HttpClient 5.0 HTTPS 代理:“没有隧道,除非连接”

我正在使用最新版本的 JDK8 我CloseableHttpAsyncClient是通过执行以下操作创建的

然后我试图做一个没有代理的发布请求。使用代理的请求也适用于使用 http 而不是 https 的 url。java.lang.IllegalStateException: No tunnel unless connected使用 https 和代理时收到以下错误。