全部产品
Search
文档中心

云数据库 RDS:设置SSL加密

更新时间:Aug 29, 2023

为了提高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的证书有效期为1年,请在到期前更新证书有效期,否则使用加密连接的客户端程序将无法正常连接。

  • 开启SSL加密、更新SSL证书时会重启实例,实例可能会有几分钟不可用。

  • 由于SSL加密的实现原理,启用SSL加密会显著增加CPU使用率,建议您仅在外网链路有加密需求的时候启用SSL加密。内网链路相对较安全,一般无需对链路加密。

  • 开通了读写分离的实例不支持SSL加密。

开启SSL加密

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
  2. 在左侧菜单栏中单击数据安全性

  3. SSL标签页,单击未开通前面的开关。

  4. 设置SSL对话框中选择要开通SSL加密的链路,单击确定,开通SSL加密。

    说明
    • 开通SSL后,数据库将支持加密连接,客户端可以选择使用加密连接或非加密连接来连接数据库。

    • 您可按需选择加密内网链路或者外网链路,但仅允许加密一条链路。

  5. 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证书安装方法。其它应用或者客户端请参见对应产品的使用说明。

  1. 单击桌面左下角搜索框,输入certmgr.msc并打开。

  2. certmgr对话框中,鼠标右击受信任的根证书颁发机构

  3. 选择所有任务 > 导入

  4. 单击下一步

  5. 证书导入向导页面中,单击浏览导入已下载的SSL CA证书,并单击下一步

  6. 按个人需要选择证书存放位置后,单击下一步

  7. 单击完成等待证书导入。

  8. 打开SQL Server Management Studio,单击对话框右下角选项按钮。

    image.png
  9. 连接属性选项卡中,勾选加密连接信任服务器证书,并单击连接按钮。

    image.png
  10. 执行如下查询,若查询结果为TRUE,则说明连接已加密。

    SELECT ENCRYPT_OPTION FROM SYS.DM_EXEC_CONNECTIONS WHERE SESSION_ID = @@SPID

更新证书有效期

SSL的证书有效期为1年,请在到期前更新证书有效期,否则使用加密连接的客户端程序将无法正常连接。

重要

更新有效期操作将会重启实例,实例可能会有几分钟不可用,重启前请做好业务安排,谨慎操作。

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
  2. 在左侧导航栏单击数据安全性

  3. 选择SSL页签,单击更新有效期更新证书有效期

关闭SSL加密

重要
  • 关闭SSL加密会重启RDS实例,系统会触发主备切换降低影响,但仍建议您在业务低峰期操作。

  • 关闭SSL加密后,数据库访问性能会有一定程度提升,但安全性上有削弱,故非安全环境下不建议关闭SSL加密。

  • 关闭SSL加密后,仅支持通过非SSL方式连接。

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
  2. 在左侧导航栏单击数据安全性

  3. 选择SSL标签页。

  4. 单击已开通前面的开关,在弹出的提示框中单击确定

附录:通过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证书到期后不更新,仅会导致使用加密连接的客户端程序无法正常连接实例,不会影响实例运行或数据安全。