我用 Ubuntu 20 设置了一台新机器,发现我无法再连接到我的 RDS 数据库。
应该连接到开发环境的 spring-boot 应用程序抛出以下异常:
javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
所以我挖出了 mySql 工作台并尝试了它。这导致了这个错误:
ssl_choose_client_version:unsupported protocol
寻找那个告诉我 Ubuntu 20 将 TLSv1.2 设置为最低 TLS 版本,如果您的 MySQL 服务器不支持它,则会发生此错误(来自这里:https ://askubuntu.com/questions/1193629/why -mysql-workbench-8-x-errors-out-with-an-ssl-connection-error-choose-client-v)。我尝试关闭 SSL 的工作台,果然它可以建立连接。
显而易见的问题是,这是 Amazon RDS ... TLS 1.2 是唯一无法禁用的版本,因为它是内部使用的版本,如下所示:https ://docs.aws.amazon.com /AmazonRDS/latest/UserGuide/SQLServer.Ciphers.html
所以说真的,应该没有问题。我开始怀疑 TLS 版本是否真的是问题所在。但由于我没有任何其他线索,我按照这里的答案中的食谱重新配置我的本地 openssl 以允许最低 TLS 版本 1 并降级安全级别:https ://askubuntu.com/questions/1233186/ubuntu- 20-04-how-to-set-lower-ssl-security-level
您不知道吗,Workbench 现在连接的 SSL 设置为必需。Spring-Boot 仍然没有,我想我必须在其他地方配置它才能获得备忘录。但与其浪费时间,我宁愿解决真正的问题,即我无法通过 TLSv1.2 进行连接,而据我所知,我确实应该能够连接。这比降低我的安全性要好得多。我尝试更新数据库证书以防万一出现问题,但管理控制台发现证书没有任何问题,如果我不需要,显然不会让我更换它。所以我有点不知道下一步该尝试什么。
原来 TLS 支持取决于您在 RDS 上使用的确切数据库引擎版本。Aurora mySQL 5.6 仅支持 TLSv1.0,直到版本 1.23.1,此时 TLSv1.1 和 1.2 可用。我们的版本是 1.22.something,所以我不得不升级引擎。
即使那样它也不会起作用,因为 Ubuntu 20 还强制要求 2048 位的最小密钥长度,而 Aurora mysql 5.6 只是没有提供,而且我只能说这无法更改。您将找到可用于更改 Diffie-Hellman 密钥长度的数据库参数的文档,但事实证明这些仅适用于 SqlServer,而不适用于 MySQL。因此,您仍然必须按照此处接受的答案所述对您的 openssl.cnf 进行更改:https ://askubuntu.com/questions/1233186/ubuntu-20-04-how-to-set-lower-ssl -security-level 这会将您的 SECLEVEL 更改为 1,因此 openssl 将接受较短的 DHE 密钥。
即使那样,我的 spring-boot 应用程序也无法连接,尽管 workbench 现在可以连接。这是因为 JDBC 没有告诉服务器它可以执行 TLSv1.2,尽管它完全可以(奇怪的决定,那个),所以即使可以,服务器也永远不会尝试发送 1.2 握手。
为了告诉 JDBC 实际使用 TLSv1.2,您必须将其附加到连接字符串:
现在一切都连接起来了。
我本来希望 aurora 提供更长的密钥,而不是降低 Ubuntu 的安全性,但似乎没有办法。如果有人知道,请告诉我。