问题标签 [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.
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 中的自签名证书。
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 一起工作,请告诉我。
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。
你能帮忙吗?谢谢。
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 做一些特别的事情吗?
亲切的问候
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)
端点可能是什么问题,我正在强制端点存活一天,请对此有所了解
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
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.0和JDK 1.8.0_162,但仍然无法连接到 http2 端点
如果我使用 jdk9 与默认提供程序连接,相同的代码块可以完美运行,我在 conscrypt 配置中缺少什么?
任何帮助表示赞赏
提前致谢
java - 如何使用 HttpClient 5 使 Conscrypt SSL 提供程序在 Tomcat Web 应用程序中工作
我正在使用Apache HttpClient 5和Conscrypt通过 SSL 执行同步 HTTP 2.0 请求,如下所示:
在单元测试中运行代码是成功的。但是,如果作为在 Tomcat v8 中运行的 Web 应用程序的一部分运行,它会在调用时引发以下异常Conscrypt.newProvider()
:
message: java.lang.UnsatisfiedLinkError: Failed creating temp file (null)
它看起来像一个特权问题。有人可以指出在这种情况下我应该配置什么来解决问题吗?
java - Apache HttpClient 5.0 HTTPS 代理:“没有隧道,除非连接”
我正在使用最新版本的 JDK8 我CloseableHttpAsyncClient
是通过执行以下操作创建的
然后我试图做一个没有代理的发布请求。使用代理的请求也适用于使用 http 而不是 https 的 url。java.lang.IllegalStateException: No tunnel unless connected
使用 https 和代理时收到以下错误。