SSL 加密概述
SSL(Secure Sockets Layer)认证是客户端到云数据库服务器端的认证,表示对用户和服务器进行认证。开通 SSL 加密,可获取 CA 证书,将 CA 证书上传在服务器端,在客户端访问数据库时,将激活 SSL 协议,在客户端和云数据库服务器端之间建立一条 SSL 安全通道,实现数据信息加密传输,防止数据在传输过程中被截取、篡改,保证双方传递信息的安全性。
SSL 协议要求建立在可靠的传输层协议(TCP)之上,其优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTP、FTP、TELNET 等)能透明地建立于 SSL 协议之上。SSL 协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作,在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。
背景
SSL 是 Netscape 公司所提出的安全保密协议,通过在浏览器和 Web 服务器之间构建安全通道来进行数据传输,采用 RC4、MD5、RSA 等加密算法实现安全通讯。国际互联网工程任务组(IETF)对 SSL 3.0进行了标准化,标准化后更名为安全传输层协议(TLS)。由于 SSL 这一术语更为常用,因此本文所述 SSL 加密实际是指 TLS 加密。
说明:
腾讯云数据库支持的 TLS 版本为1.0、1.1、1.2和1.3。
使用非加密方式连接数据库时,在网络中传输的所有信息都是明文,因此存在被非法用户截取、篡改、冒充的三大风险;而 SSL 协议是为解决这三大风险而设计的,理论上可达到:
信息是加密传播,第三方无法截取。
具有校验机制,一旦被篡改,通信双方会立刻发现。
配备身份证书,防止身份被冒充。
云数据库 SQL Server 支持开启 SSL 加密来增强链路安全性,并支持下载和安装 SSL CA 证书到需要的应用服务。
注意:
SSL 加密不保护数据本身,是确保来往于客户端和云数据库服务器端之间的流量安全,在传输层对网络连接进行加密,能够提升通信数据的安全性和完整性,但会同时增加网络连接响应时间。
支持架构及版本
云数据库 SQL Server 所有架构及版本的数据库实例均支持设置 SSL 加密,其中,只读实例无需单独设置,主实例开启 SSL 加密后,其只读实例会同步生效。
注意:
若您对主实例设置 SSL 并选择在维护时间内执行,则主实例关联的只读实例的 SSL 生效时间会跟随主实例,在主实例的维护时间一起重启实例生效。
注意事项
开启 SSL 加密后,会造成实例 CPU 使用率上升、读写时延增长。建议仅在外网链路有加密需求时开启 SSL 加密。内网链路相对较安全,通常无需对链路加密。
开启 SSL 加密、更新腾讯云提供的 SSL 证书或关闭 SSL 加密操作,会重启数据库实例,实例可能会有几分钟不可用的情况,因此,操作前请您确保业务具备重连机制,建议在业务低峰期操作。
SSL 的证书具有有效期(1年),请在到期前在控制台 手动更新证书的有效期,否则,使用 SSL 加密连接的客户端程序将无法正常连接。
SSL 的证书到期后不更新,仅会导致使用加密连接的客户端程序无法正常连接实例,而不会影响实例的正常运行或数据安全。
关闭 SSL 加密后,仅支持通过非 SSL 加密方式连接实例。
开启 SSL 加密
1. 登录 SQL Server 控制台。
2. 选择地域,在实例列表单击需要开启 SSL 的实例 ID 或操作列的管理。
3. 在实例管理页选择数据安全 > SSL 加密,然后在 SSL 加密状态后单击按钮开启功能。
4. 在弹窗下选择执行时间,单击确认。
证书来源:默认使用腾讯云提供的证书。
执行时间:
立即执行:单击确认后立即开启 SSL 加密。
维护时间内:在实例维护时间内开启 SSL 加密,在实例详情页可 修改实例维护时间。
5.
成功开启后
,界面如下。
需注意,配置客户端 CA 证书为可选设置,用于客户端信任服务端。单击下载 CA 证书,可下载证书并用于配置安装到客户端。
下载的文件为压缩包(TencentDB-SSL-CA.zip),包含如下三个文件:
p7b 文件:用于 Windows 系统中导入 CA 证书。
jks 文件:Java 中的 truststore 证书存储文件,密码统一为 tencentdb,用于 Java 程序中导入 CA 证书链。
pem 文件:用于其他系统或应用中导入 CA 证书。
SSL 客户端连接登录
开启 SSL 加密后,客户端在连接登录云数据库 SQL Server 实例时,分为信任服务器证书和不信任服务器证书两种场景。若信任服务器证书,则不需要配置 SSL CA 证书即可进行加密连接;若不信任服务器证书,则需要导入并配置 SSL CA 证书后,进行加密连接。
场景一:加密连接且信任服务器证书
步骤1:加密连接登录
1. 打开 SQL Server Management Studio 客户端,单击对话框右下角的选项。
2. 在连接属性选项卡中,勾选加密连接和信任服务器证书,并单击连接。
步骤2:检查连接是否已加密
1. 通过 SSMS 成功连接登录后,在实例上右击选择属性。
2. 在弹出的服务属性页面上,点击左侧的查看连接属性。
3. 在弹出的连接属性页面上,可以查看连接是否被加密。
执行如下查询命令,若查询结果为 TRUE,则说明连接已加密,若查询结果为 FALSE,则说明连接未加密。
SELECT ENCRYPT_OPTION FROM SYS.DM_EXEC_CONNECTIONS WHERE SESSION_ID = @@SPID;
场景二:加密连接且不信任服务器证书
步骤1:下载 CA 证书
步骤2:客户端导入 CA 证书
1. 单击桌面左下角搜索框,输入 certmgr.msc 打开证书管理器。
2. 在 certmgr 对话框中,鼠标右键单击受信任的根证书颁发机构,选择所有任务 > 导入。
3. 单击下一步。
4. 在证书导入向导页面中,单击浏览导入已下载的 SSL CA 证书,并单击下一步。
5. 选择下载到本地的 TencentDB-SSL-CA 证书文件,单击打开。
6. 按个人需要选择证书存放位置后,单击下一步,然后单击完成。
您也可以通过指令导入 SSL CA 证书,例如,通过 CMD 或者 PowerShell 执行以下指令来导入证书。
CERTUTIL -addstore -enterprise -f -v root "ca.p7b"
步骤3:加密连接登录
1. 打开 hosts 文件,文件路径为 C:\\Windows\\System32\\drivers\\etc。
2. 在 hosts 文件最后一行增加 IP mssql-*******。
说明:
IP:替换成对应实例的内网 IP 或者外网 IP。
mssql-*******:替换成对应实例 ID。
3. 打开 SQL Server Management Studio 客户端,单击对话框右下角的选项。
4. 在连接属性选项卡中,勾选加密连接,并单击连接。
步骤4:检查连接是否已加密
1. 通过 SSMS 成功连接登录后,在实例上右击选择属性。
2. 在弹出的服务属性页面上,点击左侧的查看连接属性。
3. 在弹出的连接属性页面上,可以查看连接是否被加密。
执行如下查询命令,若查询结果为 TRUE,则说明连接已加密,若查询结果为 FALSE,则说明连接未加密。
SELECT ENCRYPT_OPTION FROM SYS.DM_EXEC_CONNECTIONS WHERE SESSION_ID = @@SPID
更新证书有效期
说明:
SSL 的证书具有有效期(1年),到期前您需手动更新证书,以确保使用 SSL 加密连接的客户端程序可以继续正常连接。
更新 SSL 证书过程中,会重启您的数据库实例以加载新的 SSL 证书,请确保业务具备重连机制。
1. 登录 SQL Server 控制台。
2. 选择地域,在实例列表单击目标 SSL 的实例 ID 或操作列的管理。
3. 在实例管理页选择数据安全 > SSL 加密,然后在 SSL 证书有效性后单击更新证书。
4. 在弹窗下选择执行时间,单击确认。
执行时间:
立即执行:单击确认后立即更新 SSL 证书。
维护时间内:在实例维护时间内更新 SSL 证书,在实例详情页可 修改实例维护时间。
关闭 SSL 加密
说明:
关闭 SSL 加密过程中,会重启您的数据库实例,请确保业务具备重连机制。
1. 登录 SQL Server 控制台。
2. 选择地域,在实例列表单击需要关闭 SSL 的实例 ID 或操作列的管理。
3. 在实例管理页选择数据安全 > SSL 加密,然后在 SSL 加密状态后单击按钮关闭功能。
4. 在弹窗下选择执行时间,单击确认。
执行时间:
立即执行:单击确认后立即关闭 SSL 加密。
维护时间内:在实例维护时间内关闭 SSL 加密,在实例详情页可 修改实例维护时间。
附录1:设置 SSL 时实例相关状态变化
设置 SSL 时,如果执行时间选择为维护时间内,系统会以10分钟每次的频率检查设置 SSL 的相关操作是否命中维护时间窗口,命中后,系统开始部署或关闭 SSL,完成后会立即重启服务。
说明:
如果用户设置了维护时间内操作 SSL,在未到达维护时间窗口时,目标实例状态是非运行状态,这期间此实例不能再发起其他任务,直到 SSL 加密任务完成。
示例
假设维护时间窗口为17:00-18:00,用户在17:05分设置了在维护时间窗口内开启 SSL 加密,则系统会在17:10启动异步调度任务,成功部署 SSL 证书后会立即重启服务。
实例状态变化说明
执行时间选择为维护时间内的实例状态变化如下:
17:05之前,实例状态为运行中;
17:05-17:10之间,主实例和 RO 副本实例的状态为实例 SSL 操作中;
17:10之后,主实例和 RO 副本实例的状态为任务执行中;
直到异步任务完成后,主实例和 RO 副本实例的状态才会变回运行中。
执行时间选择为立即执行的实例状态变化如下:
通过控制台发起 SSL 操作任务之后,主实例和 RO 副本实例,状态均变为任务执行中,直到异步任务完成后,状态才变回运行中。
实例 SSL 操作状态变化说明
开启 SSL 时实例操作状态的变化如下:
执行时间为立即执行:未开启->开启中->已开启。
执行时间为维护时间内:未开启->等待维护时间窗口内开启->开启中->已开启。
更新证书时实例操作状态的变化如下:
执行时间为立即执行:已开启->更新中->已开启。
执行时间为维护时间内:未开启->等待维护时间窗口内更新->更新中->已开启。
关闭 SSL 时实例操作状态的变化如下:
执行时间为立即执行:已开启->关闭中->已关闭。
执行时间为维护时间内:已开启->等待维护时间窗口内关闭->关闭中->已关闭。
常见问题
如何查看当前连接是否已启用了 SSL 加密连接?
可通过如下命令,查询 sys.dm_exec_connections 系统动态管理视图,来查看当前连接是否已启用了 SSL 加密连接:
SELECT session_id,encrypt_optionFROM sys.dm_exec_connections;GO
如果在查询 sys.dm_exec_connections 系统动态管理视图时,返回当前连接的会话 ID,并且 encrypt_option 的值为 true,则说明该连接已经成功启用了 SSL 加密。
为什么客户端程序去年还可以连接,今年无法正常连接了?
相关 API
API | 描述 |
接口(ModifyDBInstanceSSL)用于开启\\关闭\\更新实例的 SSL 加密功能。 |