我有一个在 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。
来自Connector 的文档(格式简化,因为在 Stack 上做 HTML 太难了)
对于 SSLHostConfig(同上)
换句话说,这是传递给 的值
SSLContext.getInstance()
。由于您不识别您的 Java,因此我将使用当前 Oracle LTS 版本 11 的上下文名称(已添加重点):SunJSSE 提供程序中该上下文的实现启用了 TLSv1(意味着 1.0)、TLSv1.1 和 TLSv1.2——换句话说,它意味着“最大1.2”。在旧版本的 Java 中,它还启用了 SSLv3,但在几年前 POODLE 攻击之后,它被认为不安全而被删除。(我喜欢说“POODLE 攻击”,听起来很傻。:-)
选择性地控制已启用协议列表的属性
protocols
在 SSLHostConfig 中——在上面的引用中(简要地)提到——或者sslEnabledProtocols
在 Connector 中等效但拼写不同。在旧版本中(在 8.5“合并”配置之前),它仅在使用 OpenSSL/APR 时SSLProtocol
位于连接器中。AS/400 几乎肯定使用的是IBM Java,而不是 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 之间非常重要的区别吗?
正确的答案是在周末从 Tomcat 用户列表中直接从两个开发人员那里得到的: