RDS MySQL的SSL(Secure Socket Layer)加密功能用於對傳輸中的資料進行加密,適用於增強RDS串連安全性或者滿足安全合規等情境。RDS MySQL執行個體的SSL預設處於關閉狀態。
前提條件
說明
如需使用強制SSL加密功能,請提交工單,申請將您的阿里雲帳號加入白名單。
您可以前往執行個體基本資料頁面查看以上資訊。
非Serverless基礎系列執行個體轉換為Serverless基礎系列執行個體,SSL需要再次開啟。
符合上述條件的執行個體中,有部分執行個體會報錯不支援SSL。如遇到該報錯,請升級核心小版本後再重試。
功能介紹
SSL加密功能可以對RDS MySQL和用戶端之間傳輸的資料進行加密,防止資料被第三方監聽、截取和篡改。
開啟SSL加密後,用戶端串連RDS MySQL時,可以選擇進行加密串連或者非加密串連。開啟強制SSL加密後,用戶端或代理串連RDS MySQL時,只能使用SSL加密串連。
開啟SSL加密時,RDS MySQL將產生伺服器憑證以及公私密金鑰。
在加密串連的建立過程中,RDS MySQL會發送伺服器憑證(包含公開金鑰)給用戶端,用戶端用收到的公開金鑰加密產生的對稱金鑰,只有RDS MySQL有私密金鑰能夠解密該對稱金鑰,RDS MySQL和用戶端將使用該對稱金鑰對通訊資料進行加密和解密,從而保證通訊的機密性。用戶端還可以使用CA認證驗證收到的伺服器憑證以確認RDS MySQL身份,防止中間人攻擊。
RDS MySQL執行個體支援的SSL鏈路加密配置及功能對比如下:
對比項 | 配置雲端認證 | 使用自訂認證開啟SSL鏈路加密 |
擷取方式 | 設定資料庫雲端認證 | 由認證認證機構發或自我簽署憑證頒發 |
認證有效期間 | 365天 | 由您自訂 |
保護的串連地址數 | 1個 | 1個 |
認證作用 | 開啟SSL鏈路加密,用戶端驗證服務端真偽。 | 開啟SSL鏈路加密,用戶端驗證服務端真偽。 |
影響
開啟SSL加密、關閉SSL加密、更新認證(MySQL 5.6、5.7版本)會重啟執行個體,RDS服務會出現執行個體切換,建議在業務低峰期操作,並確保您的應用有自動重連機制,自動重連需要在您的應用側代碼中設定。MySQL 8.0版本更新認證不會重啟執行個體。執行個體切換的影響請參見執行個體切換的影響。
開啟SSL加密後,建立加密串連會顯著增加CPU使用率。建議您僅在外網鏈路有加密需求的時候採用SSL加密,內網鏈路相對較安全,一般無需對鏈路加密。
開啟強制SSL加密後,用戶端或資料庫代理串連RDS MySQL時,只能使用SSL加密串連,非加密串連會被拒絕。
TLS 版本說明
TLS(Transport Layer Security)是一種被廣泛採用的傳輸層安全性協議,用來保障互連網通訊的私密性和資料安全性。TLS協議有很多版本,RDS MySQL不同大版本對TLS的支援情況如下:
RDS MySQL版本 | TLSv1.0 | TLSv1.1 | TLSv1.2 | TLSv1.3 |
RDS MySQL版本 | TLSv1.0 | TLSv1.1 | TLSv1.2 | TLSv1.3 |
8.0 | 支援 | 支援 | 支援 | 支援 (自20221231版本起) |
5.7 | 支援 | 支援 | 支援 | 不支援 |
5.6 | 支援 | 支援 | 支援 | 不支援 |
說明
TLSv1.0和TLSv1.1已經在2021年被IETF廢棄( RFC8996),出於安全性考慮,推薦使用TLSv1.2及以上的TLS協議進行安全通訊。
ssl_cipher預設配置說明
RDS MySQL使用OpenSSL實現TLS的安全通訊。RDS MySQL在5.7的20230831和8.0的20230930版本中,升級了OpenSSL版本到3.0,此版本預設不再支援通過TLSv1.0和TLSv1.1進行通訊(詳見OpenSSL官方文檔)。
出於相容性考慮,RDS MySQL通過調整ssl_cipher參數預設值為 "ALL:@SECLEVEL=0"
,恢複了對TLSv1.0和TLSv1.1的支援。
如果您的業務確認只使用TLSv1.2及以上版本的TLS協議,建議您在RDS控制台設定ssl_cipher參數為 ""
(空串),以獲得更高的安全層級保障。
步驟一:為RDS MySQL開啟SSL加密
訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
在左側導覽列單擊資料安全性。
在SSL頁簽下,單擊未開通前面的滑塊開關。
說明
如果沒有找到SSL頁簽,請重新確認本文的前提條件。
在彈出的對話方塊中選擇要開通SSL加密的地址,單擊確定,開通SSL加密。
您可以根據需要,選擇加密內網鏈路或者外網鏈路,但只可以選擇一條鏈路。
(可選)如果需要強制開啟SSL加密,單擊是否強制開啟右側的開啟按鈕。
開通SSL加密需要約1分鐘,您可以手動重新整理頁面查看執行個體狀態。
步驟二:下載CA認證
開啟雲端認證後,RDS MySQL資料庫提供資料庫CA認證供您下載,當您通過用戶端遠端連線RDS MySQL資料庫時,使用資料庫CA認證可以對資料庫真偽進行校正。
訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
單擊左側導覽列資料安全性,在SSL頁簽下,單擊下載CA認證。
下載的檔案為壓縮包,包含如下三種CA檔案:
步驟三:從用戶端串連RDS MySQL
開啟SSL加密後,用戶端和RDS MySQL之間的串連是否加密與用戶端的類型和設定有關。例如,用戶端可能預設採用加密串連。您可以修改用戶端的設定或代碼,要求建立加密串連以及驗證RDS MySQL的身份。
重要
如果開啟了強制SSL加密,用戶端和RDS MySQL之間的串連只能使用SSL加密串連。
命令列
MySQL Workbench
DMS
應用程式代碼
對於MySQL 5.7.11及以後版本的用戶端,在串連命令中添加--ssl-mode選項可以設定SSL加密。
說明
對於MariaDB用戶端以及MySQL 5.7.11之前的用戶端,請使用--ssl和--ssl-verify-server-cert等選項。具體請參見MariaDB和MySQL官方文檔。
--ssl-mode=DISABLED表示串連不加密。
--ssl-mode=PREFERRED或者不添加--ssl-mode選項,表示嘗試加密串連,如果無法加密則採用非加密串連。
--ssl-mode=REQUIRED,表示必須加密串連,如果無法加密則串連失敗。
--ssl-mode=VERIFY_CA,表示必須加密串連,並用本地的CA認證驗證伺服器憑證是否有效。
--ssl-mode=VERIFY_IDENTITY,表示必須加密串連,並用本地的CA認證驗證伺服器憑證是否有效,並驗證伺服器憑證的主機名稱或IP地址是否與實際串連的主機名稱或IP地址匹配。
樣本一:嘗試加密串連,如果無法加密則採用非加密串連。
mysql -h {RDS串連地址} -u {RDS帳號} -p --ssl-mode=PREFERRED
樣本二:要求加密串連,並驗證伺服器憑證的有效性。
mysql -h {RDS串連地址} -u {RDS帳號} -p --ssl-mode=VERIFY_CA --ssl-ca={CA憑證路徑}/ApsaraDB-CA-Chain.pem
開啟MySQL Workbench,選擇。
填寫RDS串連地址和帳號密碼。
在SSL頁簽下,設定Use SSL參數,指定SSL CA File為下載的PEM格式CA認證,然後單擊Test Connection或者OK。
關於Use SSL參數的選項,可以參考命令列串連方式的--ssl-mode說明。
在DMS中錄入RDS MySQL執行個體時,可設定開啟SSL參數。具體操作,請參見雲資料庫錄入。
也可以在已錄入的執行個體上右鍵,選擇編輯執行個體,然後在進階資訊中設定。
Connector/J(mysql-connector-java)是MySQL官方提供的JDBC驅動程式。本樣本使用mysql-connector-java 8.0.19版本作為依賴。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
說明
以下範例程式碼使用sslMode屬性指定SSL模式。mysql-connector-java從8.0.13版本開始支援該屬性,如果您使用更早的版本,則需要改為使用useSSL、requireSSL和verifyServerCertificate屬性,具體請參見MySQL文檔。
範例程式碼:
package com.aliyun.sample;
import com.mysql.cj.jdbc.MysqlDataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class Sample {
public static void main(String[] args) {
Connection conn = null;
MysqlDataSource mysqlDS=null;
try{
mysqlDS = new MysqlDataSource();
mysqlDS.setSslMode("VERIFY_IDENTITY");
mysqlDS.setTrustCertificateKeyStoreType("JKS");
mysqlDS.setTrustCertificateKeyStoreUrl("file:/D:\\ApsaraDB-CA-Chain\\ApsaraDB-CA-Chain.jks");
mysqlDS.setTrustCertificateKeyStorePassword("apsaradb");
mysqlDS.setServerName("rm-xxxxxx.mysql.rds.aliyuncs.com");
mysqlDS.setPort(3306);
mysqlDS.setUser("xxxxxx");
mysqlDS.setPassword("xxxxxx");
mysqlDS.setDatabaseName("xxxxxx");
conn = mysqlDS.getConnection();
}catch(Exception e){
e.printStackTrace();
} finally {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
import pymysql
try:
ssl_config = {"ca":"/path/to/path/ca.crt", "mode":"VERIFY_CA"}
conn = pymysql.connect(host='******.mysql.rds.aliyuncs.com', user='*****', passwd='******', db='*****', ssl=ssl_config)
cursor = conn.cursor()
cursor.execute('select version()')
data = cursor.fetchone()
print('Database version:', data[0])
cursor.close()
except pymysql.Error as e:
print(e)
更多操作
更新雲端認證
查看串連加密情況
強制加密串連
查看CA認證內容
關閉SSL加密
RDS MySQL伺服器雲端認證有效期間為1年,認證到期後不更新,會導致使用加密串連的用戶端程式無法正常串連執行個體。即將到期時,阿里雲將會通過郵件、站內信(事件中心)進行提醒。
您可以通過配置計劃時間配置自訂認證更新時間,RDS MySQL雲端認證會在特定時間段自動更新,詳情請參見計劃內事件。您也可以通過以下方式手動補救伺服器認證的有效期間。
重要
MySQL 8.0版本更新認證不會重啟執行個體,MySQL 5.6、5.7版本更新認證會重啟執行個體。
訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
在左側導覽列單擊資料安全性。
選擇SSL頁簽,單擊更新有效期間。
設定服務端只允許加密串連
支援,詳見步驟一:為RDS MySQL開啟SSL加密。
說明
如需使用強制SSL加密功能,請提交工單,申請將您的阿里雲帳號加入白名單。
設定用戶端只允許加密串連
以命令列為例,在串連命令中設定SSL模式為REQUIRED、VERIFY_CA或VERIFY_IDENTITY,表示只允許加密串連,如果無法加密,則串連失敗。
設定特定使用者只允許加密串連
例如,以下命令用於設定testuser帳號只允許加密串連。
ALTER USER 'testuser'@'%' REQUIRE SSL;
執行以下命令可以查看CA認證的內容。
openssl x509 -in {CA憑證路徑}/ApsaraDB-CA-Chain.pem -text
重要
關閉SSL加密會重啟RDS執行個體,系統會觸發主備切換降低影響,但仍建議您在業務低峰期操作。
訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
在左側導覽列單擊資料安全性。
選擇SSL標籤頁。
單擊已開通前面的開關,在彈出的提示框中單擊確定。
常見問題
故障排查
Java程式串連報錯Javax.net.ssl.SSLHandshakeException: DHPublicKey does not comply to algorithm constraints
jdk7和jdk8若不修改jdk安全配置,可能會報此錯誤,其他類似報錯,一般也都由Java安全配置導致。
需要修改預設的jdk安全配置,在應用程式所在主機的jre/lib/security/Java.security
檔案中,修改如下兩項配置:
jdk.tls.disabledAlgorithms=SSLv3, RC4, DH keySize < 224
jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024
Java程式串連報錯javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
Connector/J 8.0.18或更早版本串連到MySQL 5.6或5.7時,因為相容性原因禁用了TLS 1.2和更高版本。您可以通過以下任一方式解決該問題。