Tomcat (9.0.48)Не начинается с TLSv1.3 и явных шифров в server.xml :Процедуры SSL:SSL_CTX_set_cipher_list:нет соответствия шифра для приложения JDK11

#tomcat #tomcat9 #tls1.3

Вопрос:

 <Connector port=443
           protocol="org.apache.coyote.http11.Http11Nio2Protocol"
           maxThreads="150" SSLEnabled="true"
           sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation">
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
    <SSLHostConfig protocols="TLSv1.3" ciphers="TLS_AES_128_GCM_SHA256">
        <Certificate certificateKeyFile="conf/certs/key.pem"
                     certificateFile="conf/certs/cert.pem"
                     type="RSA" />
    </SSLHostConfig>
    </Connector>
 

Ошибка:

 16-Aug-2021 16:50:42.662 WARNING [main] org.apache.tomcat.util.net.openssl.OpenSSLContext.init Error initializing SSL context
        java.lang.Exception: Unable to configure permitted SSL ciphers (error:1410D0B9:SSL routines:SSL_CTX_set_cipher_list:no cipher match)
                at org.apache.tomcat.jni.SSLContext.setCipherSuite(Native Method)
                at org.apache.tomcat.util.net.openssl.OpenSSLContext.init(OpenSSLContext.java:245)
                at org.apache.tomcat.util.net.SSLUtilBase.createSSLContext(SSLUtilBase.java:246)
                at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:97)
                at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:71)
                at org.apache.tomcat.util.net.Nio2Endpoint.bind(Nio2Endpoint.java:141)
                at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1208)
                at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1221)
                at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:603)
                at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:80)
                at org.apache.catalina.connector.Connector.initInternal(Connector.java:1046)
                at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
                at org.apache.catalina.core.StandardService.initInternal(StandardService.java:561)
                at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
                at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:1049)
                at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
                at org.apache.catalina.startup.Catalina.load(Catalina.java:724)
                at org.apache.catalina.startup.Catalina.load(Catalina.java:746)
                at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
                at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                at java.base/java.lang.reflect.Method.invoke(Method.java:566)
                at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:305)
                at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:475)
 

Является ли выбор шифров TLS еще не поддерживаемым в Tomcat, если мы используем TLSv1.3 ?

Комментарии:

1. Неужели Tomcat еще не поддерживает управление шифрами TLSv1.3?

2. Какую версию родной библиотеки Apache Tomcat, APR и OpenSSL вы используете? Они регистрируются во время запуска сервера. Также, какую ОС вы используете?

3. использование версии APR [1.6.3] org.apache.catalina.core. AprLifecycleListener.initializeSSL успешно инициализирован OpenSSL [OpenSSL 1.1.1 g FIPS 21 апреля 2020 года]

Ответ №1:

Ваша гипотеза частично верна: невозможно ограничить шифры TLSv1.3, если вы используете OpenSSL (см. <a rel=»noreferrer noopener nofollow» href=»https://lists.apache.org/thread.html/35b4104e48f69488c9d1a1c64e534425c202ab7aa5adbcfd4ba711ca@» rel=»nofollow noreferrer»>обсуждение на tomcat-users ).

OpenSSL использует различные функции для настройки наборов шифров для TLSv1.3 и предыдущих версий: *_set_ciphersuites для TLSv1.3 и *_set_cipher_list для TLSv1.2 и ниже, см. справочную страницу. Собственная библиотека Tomcat использует только второй набор функций (см. исходный код).

С другой стороны, JSSE не делает различий между наборами шифров TLSv1.2 и TLSv1.3 (см. Имена наборов шифров JSSE), поэтому ваша конфигурация будет работать, если вы измените реализацию SSL:

 <Connector port=443
           SSLEnabled="true"
           protocol="org.apache.coyote.http11.Http11Nio2Protocol"
           sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation">
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
    <SSLHostConfig protocols="TLSv1.3" ciphers="TLS_AES_128_GCM_SHA256">
        <Certificate certificateKeyFile="conf/certs/key.pem"
                     certificateFile="conf/certs/cert.pem"
                     type="RSA" />
    </SSLHostConfig>
</Connector>
 

Комментарии:

1. Спасибо вам за эту информацию и понимание, попробую.

2. Вы не указали это в своем вопросе, но если ваша цель-производительность (а AES128-самый быстрый шифр на вашей машине), то переход на JSSE с AES128 даст вам, вероятно, худшую производительность, чем OpenSSL с AES256 (особенно если у вас есть AES-NI). См. это слайд -шоу.