我发现了Http2Protocol文档,它不支持HTTPS?
某些协议(例如HTTP / 2)仅支持通过非安全连接进行HTTP升级。
是拼写错误,还是在使用Tomcat HTTP2时我必须必须使用HTTP而不是HTTPS?还是我缺少某些内容?
因为我在
中添加了UpgradeProtocol<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
对于HTTP连接器:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"/>
并使用-Xbootclasspath/p:/path/to/alpn-boot.jar
但是找不到匹配的规则:
org.apache.tomcat.util.digester.Digester.endElement No rules found matching 'Server/Service/UpgradeProtocol'.
我还尝试添加到连接器openssl implementation,但结果相同
sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation"
由于Java 8的TLS实现不支持ALPN(这是基于TLS的HTTP / 2所必需的),因此您必须使用基于OpenSSL的TLS实现来启用HTTP / 2支持。请参阅连接器的sslImplementationName属性
我必须对HTTP2使用证书/ SSL吗?
答案 0 :(得分:2)
加密为de facto mandatory以使用http / 2:
尽管标准本身不需要使用加密,但是所有 主要客户端实现(Firefox,Chrome,Safari,Opera,IE, Edge)表示,他们将仅支持基于TLS的HTTP / 2 ...
因此,您需要具有SSLHostConfig
的完全配置的Certificate
才能通过TLS运行HTTP / 2。
这样的连接器可能对您有用:
<Connector SSLEnabled="true" maxThreads="150" port="8443"
protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https"
secure="true"
sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation">
<SSLHostConfig certificateVerification="none"
sslProtocol="TLS">
<Certificate certificateKeyAlias="myKeyAlias"
certificateKeystoreFile="/path/to/my/keystore.jks"
certificateKeystorePassword="myPassword"
certificateKeystoreType="JKS">
</Certificate>
</SSLHostConfig>
<UpgradeProtocol
className="org.apache.coyote.http2.Http2Protocol" />
</Connector>
如果要使用NIO2,请将protocol
更改为org.apache.coyote.http11.Http11Nio2Protocol
。
如果要在不使用OpenSSL的情况下使用SSL,而要使用Java实现JSSE,请更改sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
(如果JRE提供)。
尽管浏览器不会在未加密的连接上升级到http / 2,但从技术上讲,可以在不使用SSL的Apache Tomcat上配置http / 2连接器并使用它,例如使用CURL-手动执行http / 2升级:
<Connector SSLEnabled="false" maxThreads="150" port="8444" protocol="org.apache.coyote.http11.Http11NioProtocol" secure="false">
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol"/>
</Connector>
CURL调试输出:
$ curl http://localhost:8444 -v --http2
...
* Connected to localhost (::1) port 8444 (#0)
> GET / HTTP/1.1
> Host: localhost:8444
> User-Agent: curl/7.60.0
> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h2c
> HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
>
< HTTP/1.1 101
< Connection: Upgrade
< Upgrade: h2c
< Date: Mon, 28 Oct 2019 12:06:18 GMT
* Received 101
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Connection state changed (MAX_CONCURRENT_STREAMS == 200)!
< HTTP/2 200
< content-type: text/html;charset=UTF-8
< date: Mon, 28 Oct 2019 12:06:18 GMT
<