RDS SQL Server的SSL(Secure Socket Layer)加密功能用于對傳輸中的數據進行加密,適用于增強RDS內外網連接的安全性、或滿足各類安全合規等場景。您可以使用阿里云提供的證書或用戶自定義證書對傳輸中的數據進行加密,同時還支持對內網鏈路強制進行SSL加密,能有效保障數據在傳輸過程中的機密性。
功能介紹
SSL加密功能可以對RDS SQL Server和客戶端之間傳輸的數據進行加密,防止數據被第三方監聽、截取和篡改。
開啟SSL加密后,客戶端連接RDS SQL Server時,可以選擇進行強制加密連接或者非加密連接。
開啟SSL加密時,RDS SQL Server將生成服務器證書以及公私鑰。
在加密連接的建立過程中,RDS SQL Server會發送服務器證書(包含公鑰)給客戶端,客戶端用收到的公鑰加密生成的對稱密鑰,只有RDS SQL Server有私鑰能夠解密該對稱密鑰,RDS SQL Server和客戶端將使用該對稱密鑰對通信數據進行加密和解密,從而保證通信的機密性。客戶端還可以使用CA證書驗證收到的服務器證書以確認RDS SQL Server身份,防止中間人攻擊。
TLS(Transport Layer Security)是SSL的后繼版本,本文統稱為SSL。
RDS SQL Server支持的TLS版本為1.0、1.1和1.2。
前提條件
使用自定義密鑰加密前,需要先完成以下操作:
已開通OSS服務。具體操作,請參見開通OSS服務。
阿里云賬號(主賬號)已授權RDS官方服務賬號可以訪問您OSS的權限。
確保自定義證書為
pfx
格式,并上傳pfx
證書到OSS中。如何上傳,請參見OSS控制臺上傳文件、OSS API分片上傳文件或使用ossbrowser工具上傳文件。
注意事項
SSL的證書有效期為1年,請在到期前更新證書有效性,否則使用加密連接的客戶端程序將無法正常連接。
開啟SSL加密、關閉SSL加密、更新SSL證書時會重啟實例,實例可能會有幾分鐘不可用。
由于SSL加密的實現原理,開啟SSL加密會顯著增加CPU使用率。建議您僅在外網鏈路有加密需求的時候啟用SSL加密,內網鏈路相對較安全,一般無需對鏈路加密。
使用限制
Serverless實例不支持SSL加密。
開通了讀寫分離的實例不支持SSL加密。
步驟一:為RDS SQL Server開啟SSL加密
訪問RDS實例列表,在上方選擇地域,然后單擊目標實例ID。
在左側菜單欄中單擊數據安全性。
在SSL標簽頁,單擊未開通前面的開關。
在設置SSL對話框中,選擇加密方式,并進行相關配置。
使用由阿里云自動生成的密鑰
參數
是否必選
說明
請選擇受保護地址:
是
選擇要開通SSL加密的鏈路。支持加密內網鏈路和外網鏈路,但僅允許加密一條鏈路。
說明如需加密外網鏈路,需確保實例已開通外網地址。更多操作,請參見開通或關閉外網地址。
是否開啟強制加密
否
開啟后將強制客戶端以加密方式連接SQL Server內網鏈路,且連接無需上傳CA證書,不再支持非加密連接方式。
支持最低TLS版本
否
選擇支持的最低TLS版本,當前支持TLS版本為1.0、1.1和1.2,低于該版本將被拒絕連接。
例如,選擇TLS 1.1,則表示服務端僅接受TLS 1.1和1.2協議版本的客戶端連接請求,通過TLS 1.0建立連接的客戶端會被拒絕連接。
使用自定義的密鑰進行加密
說明使用自定義密鑰加密前,請確保已完成操作前置條件,詳情請參見前提條件。
在上傳pfx格式證書到OSS面板中,單擊下一步。
在使用自定義密鑰加密面板中,配置如下參數,并單擊下一步。
參數
說明
OSS Bucket
選擇證書所在的OSS Bucket。
證書
選擇需要的
pfx
證書。密碼
輸入證書密碼。
在設置常規選項面板中,配置如下參數。
參數
是否必選
說明
請選擇受保護地址:
是
選擇要開通SSL加密的鏈路。支持加密內網鏈路和外網鏈路,但僅允許加密一條鏈路。
說明如需加密外網鏈路,需確保實例已開通外網地址。更多操作,請參見開通或關閉外網地址。
是否開啟強制加密
否
開啟后將強制客戶端以加密方式連接SQL Server內網鏈路,且連接無需上傳CA證書,不再支持非加密連接方式。
支持最低TLS版本
否
選擇支持的最低TLS版本,當前支持TLS版本為1.0、1.1和1.2,低于該版本將被拒絕連接。
例如,選擇TLS 1.1,則表示服務端僅接受TLS 1.1和1.2協議版本的客戶端連接請求,通過TLS 1.0建立連接的客戶端會被拒絕連接。
單擊確定,數據庫將支持SSL加密連接。
開啟SSL加密需要約1分鐘,您可以手動刷新頁面查看實例狀態。
步驟二:下載SSL CA證書
如果不使用CA證書,您也可以通過SSL加密連接RDS SQL Server。但建議您下載并使用CA證書,它可以在SSL握手階段驗證收到的服務器證書,以確認RDS SQL Server的身份,避免中間人攻擊。
訪問RDS實例列表,在上方選擇地域,然后單擊目標實例ID。
在左側菜單欄中單擊數據安全性。
在SSL頁簽下,單擊下載CA證書。
下載的文件為壓縮包,包含如下三個文件:
p7b文件:用于Windows系統中導入CA證書。
PEM文件:用于其他系統或應用中導入CA證書。
JKS文件:Java中的truststore證書存儲文件,密碼統一為apsaradb,用于Java程序中導入CA證書鏈。
重要在Java中使用JKS證書文件時,jdk7和jdk8需要修改默認的jdk安全配置,在需要SSL訪問的數據庫所在機器的
jre/lib/security/java.security
文件中,修改如下兩項配置:jdk.tls.disabledAlgorithms=SSLv3, RC4, DH keySize < 224 jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024
若不修改jdk安全配置,會報如下錯誤。其它類似報錯,一般也都由Java安全配置導致。
javax.net.ssl.SSLHandshakeException: DHPublicKey does not comply to algorithm constraints
步驟三:配置SSL CA證書
在RDS SQL Server實例中開啟SSL加密后,應用端或客戶端在連接實例時需要配置SSL CA證書。本文以Microsoft SQL Server Management Studio(SSMS)為例,介紹SSL CA證書安裝方法。其它應用或者客戶端請參見對應產品的使用說明。
單擊桌面左下角搜索框,輸入certmgr.msc并打開。
在certmgr對話框中,鼠標右擊受信任的根證書頒發機構。
選擇
。單擊下一步。
在證書導入向導頁面中,單擊瀏覽導入已下載的SSL CA證書,并單擊下一步。
按個人需要選擇證書存放位置后,單擊下一步。
單擊完成等待證書導入。
打開SQL Server Management Studio,單擊對話框右下角選項按鈕。
在連接屬性選項卡中,勾選加密連接和信任服務器證書,并單擊連接按鈕。
執行如下查詢,若查詢結果為TRUE,則說明連接已加密。
SELECT ENCRYPT_OPTION FROM SYS.DM_EXEC_CONNECTIONS WHERE SESSION_ID = @@SPID
附錄:通過SSL連接數據庫示例代碼
# -*- coding:utf-8 -*-
import ssl
import pyodbc
# 創建一個SSL上下文,用于在Python中建立安全的SSL連接
context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH, cafile="D:\ca\ApsaraDB-CA-Chain.pem")
# 建立連接
# SERVER指定目標數據庫服務器的地址;DATABASE指定連接的數據庫名稱;UID指定登錄數據庫所需的用戶名;PWD指定登錄數據庫所需的密碼;Encrypt指定是否啟用SSL加密,值為yes表示啟用。
conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=rm-2zec********.sqlserver.rds.aliyuncs.com;DATABASE=master;UID=zhttest;PWD=zht****;Encrypt=yes', ssl=context)
cursor = conn.cursor()
cursor.execute('SELECT @@version')
rows = cursor.fetchall()
for row in rows:
print(row)
# 關閉連接
conn.close()
using System;
using System.Data.SqlClient;
namespace SqlConnectionSSLExample
{
class Program
{
static void Main(string[] args)
{
// 建立連接
// Data Source指定目標SQL Server數據庫服務器的地址;Initial Catalog指定連接的目標數據庫名稱;User ID指定連接數據庫所需的用戶名;Password指定連接數據庫所需的密碼;Encrypt指定是否啟用SSL加密傳輸,值為true表示啟用。
string connectionString = "Data Source=rm-2ze********.sqlserver.rds.aliyuncs.com;Initial Catalog=master;User ID=zhttest;Password=zht****;Encrypt=true;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
// 打開連接
connection.Open();
try
{
// 執行SQL查詢
SqlCommand cmd = new SqlCommand("SELECT @@version", connection);
string result = cmd.ExecuteScalar().ToString();
Console.WriteLine(result);
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
}
}
相關API
更多操作
更新證書有效期
RDS SQL Server的SSL證書有效期為1年,證書到期后不更新,會導致使用加密連接的客戶端程序無法正常連接實例。即將到期時,阿里云將會通過短信、郵件、站內信(事件中心)的方式提醒使用自定義證書開啟SSL的用戶。請在到期前更新證書有效期,以確保客戶端程序能夠正常連接。
更新有效期操作將會重啟實例,實例可能會有幾分鐘不可用,重啟前請做好業務安排,謹慎操作。
訪問RDS實例列表,在上方選擇地域,然后單擊目標實例ID。
在左側導航欄單擊數據安全性。
選擇SSL頁簽,單擊更新有效期。
關閉SSL加密
關閉SSL加密會重啟RDS實例,系統會觸發主備切換降低影響,但仍建議您在業務低峰期操作。
關閉SSL加密后,數據庫訪問性能會有一定程度提升,但安全性上有削弱,故非安全環境下不建議關閉SSL加密。
關閉SSL加密后,僅支持通過非SSL方式連接。
訪問RDS實例列表,在上方選擇地域,然后單擊目標實例ID。
在左側導航欄單擊數據安全性。
選擇SSL標簽頁。
單擊已開通前面的開關,在彈出的提示框中單擊確定。
查看連接加密情況
在SQL Server中,可以執行如下代碼查看當前連接是否已啟用了SSL加密連接:
SELECT session_id,encrypt_option
FROM sys.dm_exec_connections;
GO
如果在查詢sys.dm_exec_connections
系統動態管理視圖時,返回當前連接的會話ID,并且encrypt_option
的值為true
,則說明該連接已經成功開啟了SSL加密。
常見問題
Q:SSL證書到期后不更新會有什么影響?會影響實例運行或數據安全嗎?
A:SSL證書到期后不更新,僅會導致使用加密連接的客戶端程序無法正常連接實例,但不會影響實例運行或數據安全。