在 SQL Server Native Client 中使用加密而不验证
适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW)
重要
SQL Server Native Client (SNAC) 未随附:
- SQL Server 2022 (16.x) 及更高版本
- SQL Server Management Studio 19 及更高版本
不建议使用 SQL Server Native Client(SQLNCLI 或 SQLNCLI11)和旧的 Microsoft OLE DB Provider for SQL Server (SQLOLEDB)进行新的应用程序开发。
对于新项目,请使用以下驱动程序之一:
对于作为 SQL Server 数据库引擎组件(版本 2012 到 2019)随附的 SQLNCLI,请参阅此支持生命周期特例。
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 驱动程序通过添加 SQLSetConnectAttr 和 SQLGetConnectAttr 函数支持加密,而无需验证。 添加了 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。