本文介紹配置了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)