【问题标题】:Tomcat (9.0.48)Not starting with TLSv1.3 and explicit ciphers in server.xml :SSL routines:SSL_CTX_set_cipher_list:no cipher match for JDK11 appTomcat (9.0.48) 不以 TLSv1.3 和 server.xml 中的显式密码开始:SSL 例程:SSL_CTX_set_cipher_list:JDK11 应用程序没有密码匹配
【发布时间】:2021-08-16 12:20:13
【问题描述】:
<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)

如果我们使用TLSv1.3,Tomcat 是否还不支持选择 TLS 密码?

【问题讨论】:

  • Tomcat 还不支持控制 TLSv1.3 密码吗?
  • 您使用的是哪个版本的 Apache Tomcat 本机库、APR 和 OpenSSL?它们在服务器启动期间被记录。还有你用的是什么操作系统?
  • 使用 APR 版本 [1.6.3] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL 成功初始化 [OpenSSL 1.1.1g FIPS 21 Apr 2020]

标签: tomcat tomcat9 tls1.3


【解决方案1】:

您的假设部分正确:如果您使用 OpenSSL(参见 discussion on tomcat-users),则无法限制 TLSv1.3 密码套件。

OpenSSL 使用不同的函数来设置 TLSv1.3 及之前版本的密码套件:*_set_ciphersuites 用于 TLSv1.3 和 *_set_cipher_list 用于 TLSv1.2 及更低版本,参见。 man page。 Tomcat Native Library 只使用第二组函数(参见source code)。

另一方面,JSSE 不区分 TLSv1.2 和 TLSv1.3 密码套件(请参阅 JSSE Cipher Suites Names),因此如果您更改 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>

【讨论】:

  • 感谢您提供此信息和见解,将尝试一下。
  • 您没有在问题中指定它,但如果您的目标是性能(并且 AES128 是您机器上最快的密码),那么使用 AES128 切换到 JSSE 可能会比您的性能更差带有 AES256 的 OpenSSL(特别是如果您有 AES-NI)。参照。 this slideshow.
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 2018-01-20
  • 2021-10-21
  • 2015-10-07
  • 2021-04-04
  • 2019-03-31
  • 1970-01-01
相关资源
最近更新 更多