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 打开证书管理控制台,删除对应的证书
Copyright © www.sqlfans.cn 2021 - 2026 All Right Reserved更新时间: 2026-09-08 14:41:02

results matching ""

    No results matching ""