我在 Amazon Linux EC2 Linux 实例上运行了一台 Tomcat 8.5 服务器。Tomcat 在端口 8443 上运行,IPTables 将 443 重新映射到该端口。
我已将连接器的“sslProtocol”子句更改为指定 TLS 1.2 协议。但更改不起作用:它仍然接受 TLS 1.0 和 1.1 以及 1.2。有人知道问题可能出在哪里吗?
连接器如下所示(敏感信息已删除):
<Connector port="8443" proxyPort="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
compression="on" compressionMinSize="2048" noCompressionUserAgents="gozilla, traviata" compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,text/json,application/x-javascript,application/javascript,application/json"
maxThreads="1000" socket.appReadBufSize="1024" socket.appWriteBufSize="1024" bufferSize="1024" SSLEnabled="true" scheme="https" secure="true"
keystoreFile="/etc/tomcat8/dev.REDACTED.net.ks" keyAlias="REDACTED" ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA"
clientAuth="false" sslProtocol="TLSv1.2" />
(以前,“sslProtocol”子句是‘sslProtocol="TLS"’)
相同的“sslProtocol”子句在客户 AS/400 上运行的 Tomcat 7 服务器的连接器标签中运行良好,将其限制为 TLS 1.2。
答案1
从Connector 的文档(格式已简化,因为在 Stack 上执行 HTML 太难了)
sslProtocol 这是 SSLHostConfig 元素的 sslProtocol 属性的别名,其 hostName 为默认。如果未明确定义此 SSLHostConfig 元素,则会创建它。
和对于 SSLHostConfig(同上)
sslProtocol 仅限 JSSE。要使用的 SSL 协议(单个值可能启用多个协议 - 有关详细信息,请参阅 JVM 文档)。如果未指定,则默认为 TLS。创建 SSLContext 实例时,可以从 JVM 文档中获取算法允许的值,例如 Oracle Java 7。注意:此属性与协议之间存在重叠。
换句话说,这是传递给 的值SSLContext.getInstance()
。由于您没有识别您的 Java,因此我将使用上下文名称当前 Oracle LTS 版本,11(强调添加):
TLSv1.2 支持 RFC 5246:TLS 版本 1.2;可能支持其他 SSL/TLS 版本
还有执行SunJSSE 提供程序中的该上下文启用了 TLSv1(即 1.0)、TLSv1.1 和 TLSv1.2——换句话说,它意味着“最大限度1.2”。在旧版本的 Java 中,它还启用了 SSLv3,但在几年前的 POODLE 攻击之后,该功能因不安全而被删除。(我喜欢说“POODLE 攻击”,因为它听起来很傻。:-)
属性选择性地控制启用协议列表的方法是protocols
使用 SSLHostConfig(在上面的引文中简要提到过)或sslEnabledProtocols
与 Connector 等效但拼写不同。在旧版本中(8.5 合并配置之前),它位于SSLProtocol
Connector 中仅有的当使用 OpenSSL/APR 时。
相同的“sslProtocol”子句在客户 AS/400 上运行的 Tomcat 7 服务器的连接器标签中运行良好,将其限制为 TLS 1.2。
AS/400 几乎肯定使用IBMJava,而不是 Sun-now-Oracle-now-OpenJDK。IBM 很早就从 Sun 获得了源代码许可,并保证与 Sun 定义的 Java 规范兼容——该规范明确排除并且仍然提供加密提供程序。IBM 有自己的加密提供程序,它们与 Sun/Oracle/Open 的加密提供程序不同(尽管功能非常相似),因此要了解它对特定 SSLContext 的作用,您需要在 IBM 网站(或某些)上找到 IBM 文档,但我总是发现它无法导航。它可能实施 TLSv1.2 为“最低限度1.2”且
PS:你真的同时拥有 RSA 吗和您的密钥库中是否有 ECC 证书?如果没有,那么您用于密码的大量值中的大部分都是无用的,浪费的杂乱。此外,任何地方都没有理智的客户端想要使用静态 ECDH(或静态 DH)密码套件。您是否了解 TLS 术语中 ECDH 和 ECDHE 之间非常重要的区别?
答案2
正确答案在上周末从 Tomcat 用户列表中传来,直接来自两位开发人员:
sslEnabledProtocols="TLSv1.2"