Microsoft.Data.SqlClient 中的加密和证书验证
SQL Server 始终对与登录相关的网络数据包进行加密。 如果服务器在启动时未预配有任何证书,SQL Server 将生成可用于加密登录数据包的自签名证书。
概括而言,客户端和服务器之间的加密可确保只有客户端和服务器才能读取数据。 服务器证书验证是加密过程中的一个重要部分。 通过服务器证书验证,客户端可以确保服务器就是所指的服务器。 证书将接受包括是否过期、信任链,以及证书中的名称是否与客户端连接到的服务器的名称相匹配在内的一系列验证。 有关详细信息,请参阅传输层安全性和数字证书。
强烈建议在 SQL Server 上预配可验证的证书,以实现安全连接。 传输安全性层 (TLS) 只能通过证书验证来确保安全。
应用程序可以通过使用 Encrypt
连接字符串关键字或连接属性请求对所有网络流量加密。 默认情况下,要加密某个连接的所有网络流量,需要在服务器上预配证书。 通过将客户端设置为信任服务器上的证书,可能会容易受到中间人攻击。 如果在服务器上部署可验证证书,请确保客户端 Encrypt
设置为 True
,Trust Server Certificate
设置为 False
。
若要在服务器上尚未提供证书时启用加密,可以使用 Encrypt
和 Trust Server Certificate
客户端设置。 在这种情况下,加密使用自签名服务器证书,而无需客户端验证。 此配置会加密连接,但不会阻止客户端和服务器之间的设备截获连接和代理加密。
加密和证书验证行为的更改
Microsoft.Data.SqlClient 版本 4.0 在加密设置中引入了中断性变更。 Encrypt
现在默认为 True
。
Microsoft.Data.SqlClient 版本 2.0 在 Trust Server Certificate
设置行为中引入了中断性变更。 以前,如果 Encrypt
设置为 False
,则无论 Trust Server Certificate
设置如何,都不会验证服务器证书。 现在,如果服务器强制加密,即使 Encrypt
设置为 False
,也会根据 Trust Server Certificate
设置验证服务器证书。
4.0 版
下表描述了加密和证书设置的加密和验证结果:
Encrypt 客户端设置 |
Trust Server Certificate 客户端设置 |
Force encryption 服务器设置 |
结果 |
---|---|---|---|
False | False(默认值) | 否 | 仅对 LOGIN 数据包进行加密。 证书未验证。 |
False | False(默认值) | 是 | (版本 1.0 到 2.0 中的行为变更)仅当存在可验证的服务器证书时,才对所有网络流量进行加密,否则连接尝试将失败。 |
False | True | 是 | 对所有网络流量进行加密,并且不验证证书。 |
True(新的默认值) | False(默认值) | 不适用 | 仅当存在可验证的服务器证书时,才对所有网络流量进行加密,否则连接尝试将失败。 |
True(新的默认值) | True | 空值 | 对所有网络流量进行加密,但不验证证书。 |
严格(在版本 5.0 中添加) | 不适用 | 不适用 | 仅当存在可验证的服务器证书时,才使用 TDS 8 对所有网络流量进行加密,否则连接尝试将失败。 |
注意
上表只提供了不同配置下系统行为的指南。 为了实现连接安全性,请确保客户端和服务器都需要加密。 另请确保服务器有可验证的证书,且客户端上的 TrustServerCertificate
设置设为 False
。
从 Microsoft.Data.SqlClient 版本 5.0 开始,HostNameInCertificate
是一个新的连接选项。 服务器证书验证可确保证书中的公用名 (CN) 或使用者备用名称 (SAN) 与所连接的服务器名称相匹配。 在某些情况下(例如 DNS 别名),服务器名称可能与 CN 或 SAN 不匹配。 可使用 HostNameInCertificate
值在服务器证书中指定不同的预期 CN 或 SAN。
版本 2.0
从版本 2.0 开始,当服务器强制加密时,客户端将根据 Trust Server Certificate
设置验证服务器证书,而不考虑 Encrypt
设置。
下表描述了加密和证书设置的加密和验证结果:
Encrypt 客户端设置 |
Trust Server Certificate 客户端设置 |
Force encryption 服务器设置 |
结果 |
---|---|---|---|
False(默认值) | False(默认值) | 否 | 仅对 LOGIN 数据包进行加密。 证书未验证。 |
False(默认值) | False(默认值) | 是 | (行为变更)仅当存在可验证的服务器证书时,才对所有网络流量进行加密,否则连接尝试将失败。 |
False(默认值) | True | 是 | 对所有网络流量进行加密,并且不验证证书。 |
True | False(默认值) | 不适用 | 仅当存在可验证的服务器证书时,才对所有网络流量进行加密,否则连接尝试将失败。 |
True | True | 空值 | 对所有网络流量进行加密,但不验证证书。 |
注意
上表只提供了不同配置下系统行为的指南。 为了实现连接安全性,请确保客户端和服务器都需要加密。 另请确保服务器有可验证的证书,且客户端上的 TrustServerCertificate
设置设为 False
。
版本 1.0
下表描述了加密和证书设置的加密和验证结果:
Encrypt 客户端设置 |
Trust Server Certificate 客户端设置 |
Force encryption 服务器设置 |
结果 |
---|---|---|---|
False(默认值) | False(默认值) | 否 | 仅对 LOGIN 数据包进行加密。 证书未验证。 |
False(默认值) | False(默认值) | 是 | 对所有网络流量进行加密,但不验证证书。 |
False(默认值) | True | 是 | 对所有网络流量进行加密,并且不验证证书。 |
True | False(默认值) | 不适用 | 仅当存在可验证的服务器证书时,才对所有网络流量进行加密,否则连接尝试将失败。 |
True | True | 空值 | 对所有网络流量进行加密,但不验证证书。 |