#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). См. это слайд -шоу.