为了提高RDS SQL Server的链路安全性,您可以启用SSL(Secure Sockets Layer)加密,并安装SSL CA证书到需要的应用服务。SSL在传输层对网络连接进行加密,能提升通信数据的安全性和完整性,但会同时增加网络连接响应时间。
背景信息
SSL是Netscape公司所提出的安全保密协议,在浏览器和Web服务器之间构造安全通道来进行数据传输,采用RC4、MD5、RSA等加密算法实现安全通讯。国际互联网工程任务组(IETF)对SSL 3.0进行了标准化,标准化后更名为安全传输层协议(TLS)。由于SSL这一术语更为常用,因此本文所述SSL加密实际是指TLS加密。
RDS支持的TLS版本为1.0、1.1和1.2。
注意事项
开启SSL加密
- 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
在左侧菜单栏中单击数据安全性。
在SSL标签页,单击未开通前面的开关。
在设置SSL对话框中选择要开通SSL加密的链路,单击确定,开通SSL加密。
说明开通SSL后,数据库将支持加密连接,客户端可以选择使用加密连接或非加密连接来连接数据库。
您可按需选择加密内网链路或者外网链路,但仅允许加密一条链路。
在SSL页签下,单击下载CA证书,下载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的证书有效期为1年,请在到期前更新证书有效期,否则使用加密连接的客户端程序将无法正常连接。
更新有效期操作将会重启实例,实例可能会有几分钟不可用,重启前请做好业务安排,谨慎操作。
- 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
在左侧导航栏单击数据安全性。
选择SSL页签,单击更新有效期。
关闭SSL加密
关闭SSL加密会重启RDS实例,系统会触发主备切换降低影响,但仍建议您在业务低峰期操作。
关闭SSL加密后,数据库访问性能会有一定程度提升,但安全性上有削弱,故非安全环境下不建议关闭SSL加密。
关闭SSL加密后,仅支持通过非SSL方式连接。
- 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
在左侧导航栏单击数据安全性。
选择SSL标签页。
单击已开通前面的开关,在弹出的提示框中单击确定。
附录:通过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}");
}
}
}
}
}
在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证书到期后不更新,仅会导致使用加密连接的客户端程序无法正常连接实例,不会影响实例运行或数据安全。