全部產品
Search
文件中心

ApsaraDB RDS:SSL串連RDS MySQL資料庫

更新時間:Jul 06, 2024

本文介紹配置了SSL鏈路加密後,如何通過MySQL命令列終端以及JDBC串連資料庫。

前提條件

操作步驟

使用雲端認證串連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)

使用自訂認證串連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地址匹配。

樣本:

  1. 嘗試加密串連,如果無法加密則採用非加密串連。

    mysql -h {RDS串連地址} -u {RDS帳號} -p --ssl-mode=PREFERRED
  2. 要求加密串連,並驗證伺服器憑證的有效性。

    mysql -h {RDS串連地址} -u {RDS帳號} -p --ssl-mode=VERIFY_CA --ssl-ca={自訂CA憑證路徑}
說明
  • 上述樣本裡的{RDS串連地址}{RDS帳號}{CA憑證路徑}{自訂CA憑證路徑}需替換為實際的值。

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

MySQL Workbench

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

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

  3. SSL頁簽下,設定Use SSL參數,如果為雲端認證則指定SSL CA File為下載的PEM格式CA認證,如果配置的為自訂認證則指定SSL CA File為自訂的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>
重要

配置為自訂認證,需要手動產生JKS檔案,具體步驟如下:

  1. 將你的用戶端認證和私密金鑰轉換成PKCS#12格式,因為keytool不直接支援從PEM格式匯入私密金鑰和認證。使用OpenSSL做這個轉換:

    openssl pkcs12 -export -in {自訂CA認證} -inkey {自訂CA認證私密金鑰} -out keystore.p12 -name ganyang -CAfile {自訂CA認證}
    # 需要輸入密碼,串連時需要使用
    Enter Encryption Password:
    Verifying - Enter Encryption Password:
  2. 使用keytool匯入剛才建立的PKCS#12檔案到新的JKS檔案):

    keytool -importkeystore -deststorepass JKS-password -destkeypass key-password -destkeystore keystore.jks -deststoretype pkcs12 -srckeystore keystore.p12 -srcstoretype pkcs12 -srcstorepass P12-password -alias your-alias

    關鍵詞解釋:

    -deststorepass 為JKS檔案設定的密碼。
    -destkeypass 為JKS檔案裡的密鑰設定的密碼。
    -destkeystore 想要建立或已有的JKS檔案。
    -deststoretype 想要建立檔案的類型是PKCS#12。
    -srckeystore 之前產生的PKCS#12檔案。
    -srcstoretype 表明源檔案的類型是PKCS#12。
    -srcstorepass 保護PKCS#12檔案的密碼。
    -alias 使用者給的用戶端認證和私密金鑰設定的別名。
  3. 擷取建立的JKS文:在keytool成功匯入後可在執行目錄下找到keystore.jks。

說明

以下範例程式碼使用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");

            //以下為雲端認證的JKS實現方式,如果MySQL配置為自訂認證,替換為通過自訂認證產生的JKS檔案路徑和對應密碼即可
            //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)