sqlserver启用加密连接
加密连接是指客户端程序和 SQL Server 通信时的加密,保护数据在传输过程中的安全,防止数据中途被窃取。它是 SQL Server 的 TDS 协议和 TLS 协议结合完成的,是在客户端驱动程序(ADO.NET、JDBC、OLEDB等)和 SQL Server 服务端实现的,对上层应用程序透明。
配置过程
- 配置 SQL Server 的加密连接,主要涉及三个层面:证书管理、服务端设置、客户端设置。
注:SQL Server 2019 及更高版本,可以直接在 SQL Server 配置管理器中完成添加证书、设置模式等全部操作。
1.准备证书
- 无论是在服务端还是客户端配置连接加密,都需要配置证书
- 对于生产环境,推荐使用受信任CA颁发的证书。
场景1:使用 CA 第三方证书
- 第1步,准备好 CA 机构颁发的第三方证书
- 第2步,运行 certlm.msc 打开证书管理控制台,依次选择“受信任的根证书颁发机构 → 证书 → 所有任务 → 导入”
- 第3步,在“证书导入向导”页面,单击“浏览”导入 CA 证书(.pfx格式),单击“下一步”
注:此后下一步需要为密钥输入密码
- 第4步,选择证书存放位置“受信任的根证书颁发机构”,单击“下一步”,随后完成证书导入
注:一定要将证书存放到“受信任的根证书颁发机构”存储区中
场景2:使用 self-generated 自签名证书
- SQL Server 在启动期间会动态生成自签名证书,该证书只存在于进程内存中,不会以任何形式持久化(包括注册表或磁盘),每次重启会重新生成
- 可以借助 Powershell 创建自签名证书,并将其持久化到证书存储区(Local Machine\Personal),这样重启 SQL Server 仍会加载此证书
# Define parameters
$certificateParams = @{
Type = "SSLServerAuthentication"
Subject = "CN=$env:COMPUTERNAME"
DnsName = @("$($env:COMPUTERNAME)", $([System.Net.Dns]::GetHostEntry('').HostName), 'localhost')
KeyAlgorithm = "RSA"
KeyLength = 2048
HashAlgorithm = "SHA256"
TextExtension = "2.5.29.37={text}1.3.6.1.5.5.7.3.1"
NotAfter = (Get-Date).AddMonths(36)
KeySpec = "KeyExchange"
Provider = "Microsoft RSA SChannel Cryptographic Provider"
CertStoreLocation = "cert:\LocalMachine\My"
}
# Call the cmdlet
New-SelfSignedCertificate @certificateParams
- 运行 certlm.msc 打开证书管理控制台,展开“个人 → 证书”可以看到上一步创建的自签名证书
2.服务端配置
- 第1步,打开“SQL Server 2019 配置管理器”,选中“MSSQLSERVER的协议”右键选择“属性”,在新打开的窗口将“强行加密”改为 是
注:如果是 SQL Server 故障转移群集或者 AlwaysOn 环境,则每个节点都需要配置
- 第2步,绑定证书,将“证书”指定为 Powershell 创建的自签名证书(示例 WIN104),然后重启 MSSQLSERVER 服务
注:由于本人没有可用的 CA 证书,这里只能用自签名证书进行测试。
- 第3步,以管理员身份运行 Powershell,运行如下脚本,将 Windows 配置为仅使用 TLS 1.2 和 TLS 1.3 进行连接,然后重启 SQL Server 服务,以使新的 TLS 设置生效。
注:为了兼容性,请根据情况决定是否禁用 TLS 1.0、TLS 1.1 协议
Set-StrictMode -Version Latest
$base = 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\'
$protocols = [ordered]@{
"SSL 2.0" = $false
"SSL 3.0" = $false
"TLS 1.0" = $false
"TLS 1.1" = $false
"TLS 1.2" = $true
"TLS 1.3" = $true
}
foreach ($version in $protocols.Keys) {
$enabledValue = $protocols[$version]
$path = $base + $version + '\Server'
New-Item $path -Force | Out-Null
New-ItemProperty -Path $path -Name 'Enabled' -Value $enabledValue -PropertyType 'DWord' -Force | Out-Null
Write-Host "$version is $enabledValue."
}
3.客户端设置
- 无论是在服务端还是客户端配置连接加密,都需要使用证书。
场景1:使用 CA 第三方证书
- 第1步,在客户端机器(比如应用服务器)上:将证书导入到“本地计算机”的“受信任的根证书颁发机构”存储区
注:运行 certlm.msc 打开证书管理控制台,依次选择“受信任的根证书颁发机构 → 证书 → 所有任务 → 导入”
- 第2步,针对应用程序,连接字符串配置:Encrypt=True;TrustServerCertificate=False;(有加密、有身份验证,安全级别:高)
注:只需在连接字符串中明确要求加密,不需要在连接字符串中做额外配置来信任证书,验证过程会自动进行
# ADO.NET
ConnectionString = "Data Source=127.0.0.1,1433;Initial Catalog=db01;User ID=test;Password=***;Encrypt=True;TrustServerCertificate=False;";
# JDBC
getConnection("jdbc:sqlserver://127.0.0.1:1433;DatabaseName=db01;encrypt=true;trustServerCertificate=false;", "test", "***");
- 第3步,针对新版、老版的 SQL Server Management Studio,配置如下:
注:使用 CA 证书的话,不要勾选“信任服务器证书”,否则会使用 SQL Server 自签名的证书。
场景2:使用 self-generated 自签名证书
- 第1步,针对应用程序,连接字符串配置:Encrypt=True;TrustServerCertificate=True;(有加密、但身份没有验证,安全级别:低)
注:TrustServerCertificate=True 指示客户端跳过对服务器证书的验证,接受任何来自服务器的证书,容易遭受中间人攻击,不建议在生产环境中使用
# ADO.NET
ConnectionString = "Data Source=127.0.0.1,1433;Initial Catalog=db01;User ID=test;Password=***;Encrypt=True;TrustServerCertificate=True;";
# JDBC
getConnection("jdbc:sqlserver://127.0.0.1:1433;DatabaseName=db01;encrypt=true;trustServerCertificate=true;", "test", "***");
- 第2步,针对新版、老版的 SQL Server Management Studio,配置如下:
注:这里勾选了“信任服务器证书”,SQL Server 则会使用自签名的证书,从而跳过对服务器证书的验证
4.测试验证
- 第1步,通过 ERROR_LOG 查看 SQL Server 加载了哪种类型的证书,是自签名证书,还是 CA 证书?
--.执行如下语句
exec sys.xp_readerrorlog 0,1,N'certificate',Null,Null,NULL,'DESC'
--.使用 SQL Server 默认在启动期间生成的自签名证书
A self-generated certificate was successfully loaded for encryption.
--.使用 CA 证书
The certificate [Cert Hash(sha1) "99D2BF3240201B1A18072863DF4FC794819BDB7B"] was successfully loader for encryption.
- 第2步,验证网络连接是否加密,若 encrypt_option 为 TRUE/FALSE 则表示连接已加密/未加密
SELECT session_id, encrypt_option FROM sys.dm_exec_connections --WHERE session_id = @@spid
附录
如何移除加密连接
- 第1步,[必做] 打开“SQL Server 2019 配置管理器”,选中“MSSQLSERVER的协议”右键选择“属性”,在“标志”标签页将“强行加密”改为 否,在“证书”标签页清除证书,然后重启 MSSQLSERVER服务
- 第2步,[必做] 针对应用程序,连接字符串移除:Encrypt=True;TrustServerCertificate=xxx
- 第3步,[选做] 针对SSMS,登录的时候不要勾选“加密连接、信任服务器证书”
- 第4步,[选做] 运行 certlm.msc 打开证书管理控制台,删除对应的证书







