IllegalArgumentException:在 HTTP 协议中发现无效字符
Posted
技术标签:
【中文标题】IllegalArgumentException:在 HTTP 协议中发现无效字符【英文标题】:IllegalArgumentException: Invalid character found in the HTTP protocol 【发布时间】:2020-12-28 21:34:33 【问题描述】:我在 Amazon EC2 实例中开发并部署了一个 Spring Boot REST 应用程序。然后我创建了一个 CloudFront 分配,其行为为“将 HTTP 重定向到 HTTPS”,源配置为“仅 HTTP”,以便能够通过 HTTPS 访问 Rest API。
通常,当应用程序通过 EC2 的自身域通过 http 访问时,一切正常。但是当我开始通过 https CloudFront 链接访问时,应用程序开始在一段时间后静默死机。
我应该采取什么措施来防止应用被终止?
这是我在日志文件中看到的。但这不是崩溃日志,应用程序在此日志后继续运行:
2020-09-09 00:09:15.877 INFO 27720 --- [nio-8080-exec-3] o.apache.coyote.http11.Http11Processor : Error parsing HTTP request header
Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in the HTTP protocol [HTTP/1.10x0aHost:]
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:560) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:260) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_252]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_252]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_252]
2020-09-09 11:24:35.544 INFO 27720 --- [nio-8080-exec-5] o.apache.coyote.http11.Http11Processor : Error parsing HTTP request header
Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in the HTTP protocol [HTTP/1.10x0aHost:]
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:560) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:260) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_252]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_252]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_252]
LOGBACK: No context given for c.q.l.core.rolling.SizeAndTimeBasedRollingPolicy@532445947
仅此而已,没有其他异常,没有关闭日志,不幸的是没有其他线索...
我正在使用以下命令来运行应用程序:
sudo nohup java -Dspring.profiles.active=stage -jar myapplication.jar &
Spring Boot 版本为 2,EC2 实例为 Amazon Linux 2018.3
编辑:我正在添加一些关于 CloudFront 配置的图片。
原始配置:
行为配置:
【问题讨论】:
能否提供您的重定向配置的详细信息?我的猜测是您尝试将一个端口上的 HTTP 重定向到同一端口上的 HTTPS - 这是行不通的。 @SteffenUllrich 我编辑了我的原始帖子以添加一些配置图像 【参考方案1】:配置支持的 CloudFront 分配的 HTTP 版本 作为
HTTP/1.1、HTTP/1.0
而不是
HTTP/2、HTTP/1.1、HTTP/1.0
解决了问题。
原帖中的异常仍然存在,但不再终止。
我认为服务于 Rest API 的应用程序不支持 HTTP 2,当从 CloudFront 重定向时,一些 HTTP 2 请求到达。然后以某种方式处理不受支持的 http 请求版本会导致一些致命错误,从而导致终止。如果我错了,请纠正我。
【讨论】:
【参考方案2】:正如 Steffen 所提到的,HTTPS 流量正在转发到您的应用程序。您的 Cloud Front 配置应该执行 SSL 终止,然后将请求转发到您的应用程序。
【讨论】:
好的,听起来不错。那么如何配置 CloudFront 来进行 SSL 终止呢? CloudFront 通过 HTTP 连接到源,因此它正在终止 TLS。我相信这是一个不同的问题。但我在 CF 配置中没有看到问题以上是关于IllegalArgumentException:在 HTTP 协议中发现无效字符的主要内容,如果未能解决你的问题,请参考以下文章
IllegalArgumentException:无效的列纬度
Retrofit-IllegalArgumentException:意外的 url
引起:java.lang.IllegalArgumentException:属性'driverClassName'不能为空