全部產品
Search
文件中心

ApsaraDB RDS:快速配置SSL加密

更新時間:Jul 25, 2024

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

前提條件

RDS MySQL執行個體系列和版本如下:

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

  • 叢集系列:8.0、5.7

  • 基礎版系列:8.0、5.7

說明
  • 您可以前往執行個體基本資料頁面查看以上資訊。

  • 非Serverless基礎系列執行個體轉成Serverless基礎系列執行個體,SSL需要再次開啟。

  • 符合上述條件的執行個體中,有部分執行個體會報錯不支援SSL。如遇到該報錯,請升級核心小版本後再重試。

功能介紹

SSL加密功能可以對RDS MySQL和用戶端之間傳輸的資料進行加密,防止資料被第三方監聽、截取和篡改。

開啟SSL加密後,用戶端串連RDS MySQL時,可以選擇進行加密串連或者非加密串連。

開啟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加密,內網鏈路相對較安全,一般無需對鏈路加密。

TLS 版本說明

TLS(Transport Layer Security)是一種被廣泛採用的傳輸層安全性協議,用來保障互連網通訊的私密性和資料安全性。TLS協議有很多版本,RDS MySQL不同大版本對TLS的支援情況如下:

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加密需要約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的身份。

命令列

對於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官方文檔。

MySQL Workbench

  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

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

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

應用程式代碼

Java

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();
            }
        }
    }

}

Python

# 安裝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)

更多操作

更新雲端認證

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值為當前使用的密碼套件。

強制加密串連

設定服務端只允許加密串連

目前不支援。

設定用戶端只允許加密串連

以命令列為例,在串連命令中設定SSL模式為REQUIRED、VERIFY_CA或VERIFY_IDENTITY,表示只允許加密串連,如果無法加密,則串連失敗。

設定特定使用者只允許加密串連

例如,以下命令用於設定testuser帳號只允許加密串連。

ALTER USER 'testuser'@'%' REQUIRE SSL;

查看CA認證內容

執行以下命令可以查看CA認證的內容。

openssl x509 -in {CA憑證路徑}/ApsaraDB-CA-Chain.pem -text

關閉SSL加密

重要

關閉SSL加密會重啟RDS執行個體,系統會觸發主備切換降低影響,但仍建議您在業務低峰期操作。

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

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

    3. 選擇SSL標籤頁。

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

    常見問題

    功能諮

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

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

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

      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