本文介紹配置了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
開啟MySQL Workbench,選擇
。填寫RDS串連地址和帳號密碼。
在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地址匹配。
樣本:
嘗試加密串連,如果無法加密則採用非加密串連。
mysql -h {RDS串連地址} -u {RDS帳號} -p --ssl-mode=PREFERRED
要求加密串連,並驗證伺服器憑證的有效性。
mysql -h {RDS串連地址} -u {RDS帳號} -p --ssl-mode=VERIFY_CA --ssl-ca={自訂CA憑證路徑}
上述樣本裡的
{RDS串連地址}
、{RDS帳號}
、{CA憑證路徑}
、{自訂CA憑證路徑}
需替換為實際的值。更多關於--ssl-mode選項的說明,請參見MySQL官方文檔。
MySQL Workbench
開啟MySQL Workbench,選擇Database > Manage Connections。
填寫RDS串連地址和帳號密碼。
在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檔案,具體步驟如下:
將你的用戶端認證和私密金鑰轉換成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:
使用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 使用者給的用戶端認證和私密金鑰設定的別名。
擷取建立的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)