Tomcat 8.5 - требуется ли сертификат/SSL для HTTP2

Я нашел документ Http2Protocol , что он не поддерживает HTTPS?

Некоторые протоколы (например, HTTP/2) поддерживают обновление HTTP только через незащищенные соединения.

Это опечатка, или я должен использовать HTTP, а не HTTPS при использовании Tomcat HTTP2, или я что-то упустил?

Поскольку я добавил UpgradeProtocol в

<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />

Для HTTP-коннектора:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"/>

И добавил соответствующий alpn jar в JAVA_OPT, используя -Xbootclasspath/p:/path/to/alpn-boot.jar

Но он не находит соответствующее правило:

org.apache.tomcat.util.digester.Digester.endElement   No rules found matching 'Server/Service/UpgradeProtocol'.

Я также попытался добавить в коннектор реализация openssl, но тот же результат

sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation"

Поскольку реализация TLS в Java 8 не поддерживает ALPN (который требуется для HTTP/2 поверх TLS), вы должны использовать реализацию TLS на основе OpenSSL, чтобы включить поддержку HTTP/2. См. атрибут sslImplementationName соединителя.

Должен ли я использовать сертификат/SSL для HTTP2?


person user7294900    schedule 28.10.2019    source источник


Ответы (1)


Шифрование де-факто обязательно для использования http/2:

Хотя сам стандарт не требует использования шифрования, все основные клиентские реализации (Firefox, Chrome, Safari, Opera, IE, Edge) заявили, что они будут поддерживать только HTTP/2 через TLS...

Таким образом, вам понадобится полностью настроенный SSLHostConfig с Certificate, чтобы запустить HTTP/2 через TLS.

Такой соединитель может подойти вам:

<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.

Если вы хотите использовать SSL без OpenSSL, но вместо этого использовать JSSE-реализацию Java, измените sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation" (если это предусмотрено вашей JRE).


Несмотря на то, что браузеры не будут обновляться до http/2 при незашифрованных соединениях, технически возможно настроить коннектор http/2 на Apache Tomcat без SSL и использовать его, например. с 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
<
person Selaron    schedule 28.10.2019
comment
Но мой вопрос касается использования HTTP2 без SSL. - person user7294900; 28.10.2019
comment
Пока ваш вопрос звучит так: вы пытаетесь включить обновление http2 и SSL для своего http-коннектора: я нашел документ Http2Protocol, что он не поддерживает HTTPS? - Это опечатка, или я должен использовать HTTP, а не HTTPS - <Connector ... secure="true"/>. Я не вижу указаний на то, что вы хотите использовать http2 без SSL/TLS. Я обновил свой ответ @user7294900 - person Selaron; 28.10.2019
comment
Таким образом, цитата Некоторые протоколы (например, HTTP/2) поддерживают обновление HTTP только через незащищенные соединения должна быть без non-? - person user7294900; 28.10.2019
comment
@ user7294900 Я снова обновил свой ответ. Я согласен, что удаление «не» будет читаться более правильно и поможет пользователям быстрее получить доступ к коннектору http/2, работающему со своим браузером. Технически вся цитата не имеет смысла, поскольку http/2 возможен и без шифрования. - person Selaron; 28.10.2019
comment
Спасибо, вы определяете как secure="false", но с scheme="https" HTTPS обязателен? - person user7294900; 28.10.2019
comment
@ user7294900 нет, это тоже можно удалить. - person Selaron; 28.10.2019