在 SQL Server Native Client 中使用加密而不验证

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)

重要

已从 SQL Server 2022 (16.x) 和 SQL Server Management Studio 19 (SSMS) 中删除SQL Server Native Client(通常缩写为 SNAC)。 不建议在新应用程序开发工作中使用 SQL Server Native Client(SQLNCLI 或 SQLNCLI11)和旧版 Microsoft OLE DB Provider for SQL Server (SQLOLEDB)。 请在此后切换为使用新版 Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server 或最新版的 Microsoft OLE DB Driver for SQL Server。 对于作为 SQL Server 数据库引擎组件附带的 SQLNCLI (版本 2012 到 2019) ,请参阅此支持生命周期异常

SQL Server 始终对与登录相关的网络数据包进行加密。 如果服务器在启动时未预配有任何证书,SQL Server 将生成可用于加密登录数据包的自签名证书。

自签名证书不能保证安全性。 加密握手基于 NT LAN Manager (NTLM)。 强烈建议在 SQL Server 上预配可验证的证书,以实现连接安全性。 传输安全性层 (TLS) 只能通过证书验证来确保安全。

应用程序还可以通过使用连接字符串关键字或连接属性请求对所有网络流量加密。 将提供程序字符串与 IDbInitialize::Initialize 配合使用时,对于 ODBC 和 OLE DB,关键字为“Encrypt”;在 IDataInitialize 中使用初始化字符串时,对于 ADO 和 OLE DB,关键字为“对数据使用加密”。 也可以通过SQL Server 配置管理器使用“强制协议加密”选项以及配置客户端来请求加密连接来配置此选项。 默认情况下,对某一连接的所有网络流量加密要求在服务器上设置证书。 通过将客户端设置为信任服务器上的证书,可能会容易受到中间人攻击。 如果在服务器上部署可验证的证书,请务必将客户端关于信任证书的设置更改为 FALSE。

有关连接字符串关键字的信息,请参阅将连接字符串关键字与SQL Server Native Client配合使用。

若要在尚未在服务器上预配证书时启用加密,可以使用 SQL Server 配置管理器 设置强制协议加密信任服务器证书选项。 在这种情况下,如果服务器上未设置可验证的证书,加密将使用不带验证的自签名服务器证书。

应用程序还可以使用 "TrustServerCertificate" 关键字或与其关联的连接属性确保执行加密。 应用程序设置从不会降低 SQL Server 客户端配置管理器设置的安全级别,相反还可能提高安全级别。 例如,如果没有为客户端设置“强制协议加密”,应用程序可能自行请求加密。 甚至是在未设置服务器证书的情况下,为保证加密,应用程序也可能请求加密和 "TrustServerCertificate"。 不过,如果在客户端配置中未启用 "TrustServerCertificate",则仍需要已设置的服务器证书。 下表介绍了各种情况:

“强制协议加密”客户端设置 “信任服务器证书”客户端设置 连接字符串/连接属性加密/对数据使用加密 连接字符串/连接属性信任服务器证书 结果
空值 否(默认值) 忽略 无加密。
空值 否(默认值) 仅当存在可验证的服务器证书时才加密,否则连接尝试将失败。
空值 始终加密,但可能使用自签名的服务器证书。
忽略 忽略 仅当存在可验证的服务器证书时才加密,否则连接尝试将失败。
否(默认值) 忽略 始终加密,但可能使用自签名的服务器证书。
否(默认值) 仅当存在可验证的服务器证书时才加密,否则连接尝试将失败。
始终加密,但可能使用自签名的服务器证书。

注意

上表只提供了不同配置下系统行为的指南。 为了实现连接安全性,请确保客户端和服务器都需要加密。 另请确保,服务器有可验证的证书,且客户端上的 TrustServerCertificate 设置设为 FALSE。

SQL Server Native Client OLE DB 访问接口

SQL Server Native Client OLE DB 提供程序通过添加 SSPROP_INIT_TRUST_SERVER_CERTIFICATE 数据源初始化属性(在 DBPROPSET_SQLSERVERDBINIT 属性集中实现)支持加密,而无需验证。 此外,还添加了新的连接字符串关键字“TrustServerCertificate”。 它接受值 yes 或 no;默认值为 no。 使用服务组件时,它接受值 true 或 false;默认值为 false。

若要详细了解 DBPROPSET_SQLSERVERDBINIT 属性集的增强,请参阅初始化和授权属性

SQL Server Native Client ODBC 驱动程序

SQL SERVER NATIVE CLIENT ODBC 驱动程序通过添加 SQLSetConnectAttrSQLGetConnectAttr 函数支持加密,而无需验证。 添加了 SQL_COPT_SS_TRUST_SERVER_CERTIFICATE 以接受 SQL_TRUST_SERVER_CERTIFICATE_YES 或 SQL_TRUST_SERVER_CERTIFICATE_NO,默认值为 SQL_TRUST_SERVER_CERTIFICATE_NO。 此外,还添加了新的连接字符串关键字 "TrustServerCertificate"。 它接受值 yes 或 no;默认值为 no。

另请参阅

SQL Server Native Client 功能