OLE DB 中的加密和证书验证
适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW)
SQL Server 始终对与登录相关的网络数据包进行加密。 如果服务器在启动时未预配有任何证书,SQL Server 将生成可用于加密登录数据包的自签名证书。
自签名证书不能保证安全性。 加密握手基于 NT LAN Manager (NTLM)。 强烈建议在 SQL Server 上预配可验证的证书,以实现安全连接。 传输安全性层 (TLS) 只能通过证书验证来确保安全。
应用程序还可以通过使用连接字符串关键字或连接属性请求对所有网络流量加密。 将访问接口字符串用于 IDbInitialize::Initialize
时,OLE DB 中的关键字为“Encrypt”,将初始化字符串用于 IDataInitialize
时,ADO 和 OLE DB 中的关键字为“Use Encryption for Data”。 还可以使用“强制协议加密”选项,在注册表中的客户端计算机上配置加密。 有关详细信息,请参阅注册表设置。 默认情况下,要加密某个连接的所有网络流量,需要在服务器上预配证书。 通过将客户端设置为信任服务器上的证书,可能会容易受到中间人攻击。 如果在服务器上部署可验证的证书,请确保将关于信任证书的客户端设置更改为 FALSE。
有关连接字符串关键字的信息,请参阅将连接字符串关键字用于 OLE DB Driver for SQL Server。
若要启用加密以便在未在服务器上预配证书时使用,可以设置 Force Protocol Encryption
和 Trust Server Certificate
客户端注册表设置。 在这种情况下,如果服务器上未预配可验证的证书,加密将使用不带验证的自签名服务器证书。
加密和证书验证行为
应用程序设置从不会降低注册表中设置的安全级别,相反还可能提高安全级别。 有关详细信息,请参阅注册表设置。 例如,如果没有为客户端设置 Force Protocol Encryption
,应用程序可能会自行请求加密。 若要保证即使没有预配服务器证书的情况下也进行加密,应用程序可能会请求加密并启用 TrustServerCertificate
。 但是,如果未在客户端配置中启用 TrustServerCertificate
,则仍需要提供服务器证书。
19 版的 OLE DB Driver for SQL Server 在加密相关 API 中引入了中断性变更。 有关详细信息,请参阅加密属性更改。
主版本 19
下表介绍了加密设置的评估:
“强制协议加密”客户端设置 | 连接字符串/连接属性加密/对数据使用加密 | 生成的加密 |
---|---|---|
0 | 否/可选 | 可选 |
0 | 是/必需(默认) | 必需 |
0 | 严格 | 严格 |
1 | 否/可选 | 必需 |
1 | 是/必需(默认) | 必需 |
1 | 严格 | 严格 |
2 | 忽略 | 严格 |
下表介绍了生成的加密和验证:
加密 | “信任服务器证书”客户端设置 | 连接字符串/连接属性信任服务器证书 | 结果 |
---|---|---|---|
可选 | 空值 | N/A | 仅对 LOGIN 数据包进行加密。 |
必需 | 0 | 忽略 | 仅当存在可验证的服务器证书时才加密,否则连接尝试将失败。 |
必需 | 1 | 否(默认值) | 仅当存在可验证的服务器证书时才加密,否则连接尝试将失败。 |
必需 | 1 | 是 | 始终加密,但可能使用自签名的服务器证书。 |
严格 | N/A | N/A | 仅当存在可验证的服务器证书时才加密,否则连接尝试将失败。 |
注意
上表只提供了不同配置下系统行为的指南。 若要进行安全连接,请确保客户端和服务器都需要加密(对于服务器端配置,请参阅在 SQL Server 上配置加密设置)。 另请确保服务器有可验证的证书,且客户端上的 TrustServerCertificate
设置设为 FALSE。
注意
从 OLE DB 驱动程序 19.2 版开始,可将 TDS 8.0 连接配置为使用 TLS 1.3。 有关详细信息,请参阅 TLS 1.3 支持。
具有新身份验证方法的主版本 18
对于版本 18.x.x,为了提高安全性,在使用新的身份验证或访问令牌连接字符串关键字(或其相应的属性)时,驱动程序会通过将默认加密值设置为 yes
来替代默认值。 重写在数据源对象初始化时发生。 如果在通过任何方法初始化之前设置加密,则会考虑该值,而不会进行重写。
注意
在 ADO 应用程序以及通过 IDataInitialize::GetDataSource
获取 IDBInitialize
接口的应用程序中,实现接口的核心组件会将加密显式设置为其默认值 no
。 因此,新的身份验证属性/关键字遵循此设置,而不会重写加密值。 因此,建议这些应用程序显式设置 Use Encryption for Data=true
来重写默认值。
为了提高安全性,新的身份验证方法遵循 TrustServerCertificate
设置(及其相应的连接字符串关键字/属性),独立于客户端加密设置。 因此,默认情况下会验证服务器证书。 驱动程序会确定是否验证服务器证书,如下所示:
“信任服务器证书”客户端设置 | 连接字符串/连接属性信任服务器证书 | 证书验证 |
---|---|---|
0 | 否(默认值) | 是 |
0 | 是 | 是 |
1 | 否(默认值) | 是 |
1 | 是 | 否 |
下表介绍了加密设置的评估:
“强制协议加密”客户端设置 | 连接字符串/连接属性加密/对数据使用加密 | 生成的加密 |
---|---|---|
0 | 否(默认值) | 否 |
0 | 是 | 是 |
1 | 否(默认值) | 是 |
1 | 是 | 是 |
下表介绍了生成的加密和验证:
生成的加密 | 证书验证 | 结果 |
---|---|---|
否 | 否 | 仅对 LOGIN 数据包进行加密。 |
否 | 是 | 仅当存在可验证的服务器证书时,才对 LOGIN 数据包进行加密,否则连接尝试将失败。 |
是 | 否 | 始终对所有网络流量进行加密,但可能使用自签名的服务器证书。 |
是 | 是 | 仅当存在可验证的服务器证书时,才对所有网络流量进行加密,否则连接尝试将失败。 |
具有旧身份验证方法的主版本 18
下表描述了旧身份验证方法的加密和验证结果:
“强制协议加密”客户端设置 | “信任服务器证书”客户端设置 | 连接字符串/连接属性加密/对数据使用加密 | 连接字符串/连接属性信任服务器证书 | 结果 |
---|---|---|---|---|
0 | 空值 | 否(默认值) | N/A | 仅对 LOGIN 数据包进行加密。 |
0 | 空值 | 是 | 否(默认值) | 仅当存在可验证的服务器证书时,才对所有网络流量进行加密,否则连接尝试将失败。 |
0 | 空值 | 是 | 是 | 始终对所有网络流量进行加密,但可能使用自签名的服务器证书。 |
1 | 0 | 忽略 | 忽略 | 仅当存在可验证的服务器证书时,才对所有网络流量进行加密,否则连接尝试将失败。 |
1 | 1 | 否(默认值) | N/A | 始终对所有网络流量进行加密,但可能使用自签名的服务器证书。 |
1 | 1 | 是 | 否(默认值) | 仅当存在可验证的服务器证书时,才对所有网络流量进行加密,否则连接尝试将失败。 |
1 | 1 | 是 | 是 | 始终对所有网络流量进行加密,但可能使用自签名的服务器证书。 |
请参阅
适用于 SQL Server 的 OLE DB 驱动程序功能
初始化和授权属性
连接字符串关键字
主版本差异
注册表设置