釋放 AI 的強大力量

100 萬免費代幣

88% 價格優惠

立即啟用
本文由簡體中文內容自動轉碼而成。阿里雲不保證此自動轉碼的準確性、完整性及時效性。本文内容請以簡體中文版本為準。

使用雲端認證快速開啟SSL鏈路加密

更新時間:2025-02-28 19:09

RDS MySQL的SSL(Secure Socket Layer)加密功能用於對傳輸中的資料進行加密,適用於增強RDS串連安全性或者滿足安全合規等情境。RDS MySQL執行個體的SSL預設處於關閉狀態。

前提條件

  • SSL加密功能要求RDS MySQL執行個體系列和版本如下:

    • 高可用系列:8.0、5.7、5.6

    • 叢集系列:8.0、5.7

    • 基礎版系列:8.0、5.7

  • 強制SSL加密要求RDS MySQL執行個體版本如下:

    • 資料庫大版本:8.0、5.7

    • 產品系列:基礎版系列、高可用系列和叢集系列

    • 核心小版本大於等於20241130

說明
  • 如需使用強制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鏈路加密

對比項

配置雲端認證

使用自訂認證開啟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加密

  1. 訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。

  2. 在左側導覽列單擊資料安全性

  3. SSL頁簽下,單擊未開通前面的滑塊開關。

    說明

    如果沒有找到SSL頁簽,請重新確認本文的前提條件

  4. 在彈出的對話方塊中選擇要開通SSL加密的地址,單擊確定,開通SSL加密。

    您可以根據需要,選擇加密內網鏈路或者外網鏈路,但只可以選擇一條鏈路。

  5. (可選)如果需要強制開啟SSL加密,單擊是否強制開啟右側的開啟按鈕。

    重要
    • 開啟強制SSL加密執行個體需要為MySQL 5.7或8.0且核心小版本大於等於20241130。

    • 開啟強制SSL加密後,用戶端或資料庫代理串連RDS MySQL時,只能使用SSL加密串連,非加密串連會被拒絕。

  6. 開通SSL加密需要約1分鐘,您可以手動重新整理頁面查看執行個體狀態。

步驟二:下載CA認證

開啟雲端認證後,RDS MySQL資料庫提供資料庫CA認證供您下載,當您通過用戶端遠端連線RDS MySQL資料庫時,使用資料庫CA認證可以對資料庫真偽進行校正。

  1. 訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。

  2. 單擊左側導覽列資料安全性,在SSL頁簽下,單擊下載CA認證

    下載的檔案為壓縮包,包含如下三種CA檔案:

    • PEM檔案:適用於絕大部分情境。

    • JKS檔案:PEM格式CA認證通常需要匯入到truststore,即轉換為JKS檔案才能在Java中使用。您可以在Java程式中使用此JKS檔案,密碼為apsaradb。

    • p7b檔案:適用於少數要求PKCS #7認證檔案的Windows應用。

步驟三:從用戶端串連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
說明
  • 上述樣本裡的{RDS串連地址}、{RDS帳號}和{CA憑證路徑}需替換為實際的值。

  • 更多關於--ssl-mode選項的說明,請參見MySQL官方文檔。

  1. 開啟MySQL Workbench,選擇Database > Manage Connections

  2. 填寫RDS串連地址和帳號密碼。

  3. SSL頁簽下,設定Use SSL參數,指定SSL CA File為下載的PEM格式CA認證,然後單擊Test Connection或者OK

    關於Use SSL參數的選項,可以參考命令列串連方式的--ssl-mode說明。

在DMS中錄入RDS MySQL執行個體時,可設定開啟SSL參數。具體操作,請參見雲資料庫錄入

也可以在已錄入的執行個體上右鍵,選擇編輯執行個體,然後在進階資訊中設定。

Java
Python

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();
            //可按需設定SslMode。關於該屬性的選項,請參見命令列串連方式的說明。
            mysqlDS.setSslMode("VERIFY_IDENTITY");
          
            //truststore用於儲存CA認證,這裡設定truststore類型為JKS。
            mysqlDS.setTrustCertificateKeyStoreType("JKS");
            // 請將file:/後面的路徑改為您的ApsaraDB-CA-Chain.jks檔案的路徑。
            mysqlDS.setTrustCertificateKeyStoreUrl("file:/D:\\ApsaraDB-CA-Chain\\ApsaraDB-CA-Chain.jks");
            // 下載的JKS檔案的密碼為apsaradb,不能修改。
            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();
            }
        }
    }

}
# 安裝pymysql    pip install pymysql

import pymysql

try:
    ssl_config = {"ca":"/path/to/path/ca.crt", "mode":"VERIFY_CA"}   # ca為認證的路徑,mode為ssl-mode
    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雲端認證會在特定時間段自動更新,詳情請參見計劃內事件。您也可以通過以下方式手動補救伺服器認證的有效期間。

說明
  • 雲端認證自動更新後,使用加密串連的用戶端程式無需重新下載和配置CA認證即可正常串連資料庫。

  • 若您需要更新自訂認證,請參見更新自訂認證

重要

MySQL 8.0版本更新認證不會重啟執行個體,MySQL 5.6、5.7版本更新認證會重啟執行個體。

  1. 訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。

  2. 在左側導覽列單擊資料安全性

  3. 選擇SSL頁簽,單擊更新有效期間

  • 查看當前會話使用的密碼套件。如果返回的Value不為空白,表示當前串連是加密的。

    SHOW STATUS LIKE 'Ssl_cipher';
  • 查看當前會話使用的SSL/TLS版本。

    SHOW STATUS LIKE 'Ssl_version';
  • 如果是MySQL命令列,還可以執行\s來查看當前串連是否加密。如果當前為加密串連,返回的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執行個體,系統會觸發主備切換降低影響,但仍建議您在業務低峰期操作。

    1. 訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。

    2. 在左側導覽列單擊資料安全性

    3. 選擇SSL標籤頁。

    4. 單擊已開通前面的開關,在彈出的提示框中單擊確定

    常見問題

    功能諮

    • Q1:如何?雙向驗證?即除了驗證服務端身份,也驗證用戶端身份。

      A:RDS MySQL目前不支援在SSL握手時驗證用戶端身份。您可以通過白名單設定、帳號管理來實現存取控制。

    • Q2:如何加密讀寫分離地址?

      A:請參見設定代理SSL加密

    • Q3:如何關閉已開啟的SSL。

      A:請參見關閉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和更高版本。您可以通過以下任一方式解決該問題。

    • 使用Connector/J 8.0.19或更高的版本。

    • 升級至RDS MySQL 8.0版本。

    • 在代碼中指定TLS版本,例如指定enabledTLSProtocols或tlsVersions屬性值為TLSv1.2。

    相關API

    • 本頁導讀 (1, M)
    • 前提條件
    • 功能介紹
    • 影響
    • TLS 版本說明
    • ssl_cipher預設配置說明
    • 步驟一:為RDS MySQL開啟SSL加密
    • 步驟二:下載CA認證
    • 步驟三:從用戶端串連RDS MySQL
    • 更多操作
    • 常見問題
    • 功能諮詢
    • 故障排查
    • 相關API
    文檔反饋
    phone 聯絡我們

    立即和Alibaba Cloud在線服務人員進行交談,獲取您想了解的產品信息以及最新折扣。

    alicare alicarealicarealicare