设置SSL加密

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。

前提条件

使用自定义密钥加密前,需要先完成以下操作:

注意事项

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

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

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

使用限制

步骤一:为RDS SQL Server开启SSL加密

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。

  2. 在左侧菜单栏中单击数据安全性

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

  4. 设置SSL对话框中,选择加密方式,并进行相关配置。

    使用由阿里云自动生成的密钥

    image

    参数

    是否必选

    说明

    请选择受保护地址:

    选择要开通SSL加密的链路。支持加密内网链路和外网链路,但仅允许加密一条链路。

    说明

    如需加密外网链路,需确保实例已开通外网地址。更多操作,请参见开通或关闭外网地址

    是否开启强制加密

    开启后将强制客户端以加密方式连接SQL Server内网链路,且连接无需上传CA证书,不再支持非加密连接方式。

    说明
    • 仅实例网络类型为专有网络(VPC)时,才支持开启强制加密。更多操作,请参见更改网络类型

    • 外网链路不支持强制加密。实例同时存在内网和外网链路时,如需对内网链路开启强制加密,您需要先释放外网。具体操作,请参见开通或关闭外网地址

    支持最低TLS版本

    选择支持的最低TLS版本,当前支持TLS版本为1.0、1.1和1.2,低于该版本将被拒绝连接。

    例如,选择TLS 1.1,则表示服务端仅接受TLS 1.1和1.2协议版本的客户端连接请求,通过TLS 1.0建立连接的客户端会被拒绝连接。

    使用自定义的密钥进行加密

    说明

    使用自定义密钥加密前,请确保已完成操作前置条件,详情请参见前提条件

    1. 上传pfx格式证书到OSS面板中,单击下一步

    2. 使用自定义密钥加密面板中,配置如下参数,并单击下一步

      image

      参数

      说明

      OSS Bucket

      选择证书所在的OSS Bucket。

      证书

      选择需要的pfx证书。

      密码

      输入证书密码。

    3. 设置常规选项面板中,配置如下参数。

      image

      参数

      是否必选

      说明

      请选择受保护地址:

      选择要开通SSL加密的链路。支持加密内网链路和外网链路,但仅允许加密一条链路。

      说明

      如需加密外网链路,需确保实例已开通外网地址。更多操作,请参见开通或关闭外网地址

      是否开启强制加密

      开启后将强制客户端以加密方式连接SQL Server内网链路,且连接无需上传CA证书,不再支持非加密连接方式。

      说明
      • 仅实例网络类型为专有网络(VPC)时,才支持开启强制加密。更多操作,请参见更改网络类型

      • 外网链路不支持强制加密。实例同时存在内网和外网链路时,如需对内网链路开启强制加密,您需要先释放外网。具体操作,请参见开通或关闭外网地址

      支持最低TLS版本

      选择支持的最低TLS版本,当前支持TLS版本为1.0、1.1和1.2,低于该版本将被拒绝连接。

      例如,选择TLS 1.1,则表示服务端仅接受TLS 1.1和1.2协议版本的客户端连接请求,通过TLS 1.0建立连接的客户端会被拒绝连接。

  5. 单击确定,数据库将支持SSL加密连接。

    开启SSL加密需要约1分钟,您可以手动刷新页面查看实例状态。

步骤二:下载SSL CA证书

如果不使用CA证书,您也可以通过SSL加密连接RDS SQL Server。但建议您下载并使用CA证书,它可以在SSL握手阶段验证收到的服务器证书,以确认RDS SQL Server的身份,避免中间人攻击。

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。

  2. 在左侧菜单栏中单击数据安全性

  3. 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. 选择所有任务 > 导入

    image.png

  4. 单击下一步

    image.png

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

    image.png

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

    image.png

  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连接数据库示例代码

# -*- 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的用户。请在到期前更新证书有效期,以确保客户端程序能够正常连接。

重要

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

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。

  2. 在左侧导航栏单击数据安全性

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

关闭SSL加密

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

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

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

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。

  2. 在左侧导航栏单击数据安全性

  3. 选择SSL标签页。

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

查看连接加密情况

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