我使用 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 連接,而據我所知,我確實應該能夠連接。這比降低我的安全等級要好得多。我嘗試更新資料庫證書,以防可能出現問題,但管理控制台沒有發現證書有任何問題,如果不需要,顯然不會讓我替換它。所以我對接下來要嘗試什麼有點不知道。
答案1
事實證明,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 應用程式無法連接,儘管工作台現在可以連接。這是因為 JDBC 沒有告訴伺服器它可以執行 TLSv1.2雖然完全可以(奇怪的決定),所以即使可以,伺服器也永遠不會嘗試發送 1.2 握手。
為了告訴 JDBC 實際上使用 TLSv1.2,您必須將其附加到連接字串中:
jdbc:myslq://<host>/<db>?enabledTLSProtocols=TLSv1.2
現在一切都連結起來了。
我想讓 aurora 提供更長的金鑰而不是降低 Ubuntu 的安全性,但似乎沒有辦法。如果有人知道,請告訴我。