本文介绍了Microsoft ODBC Driver 18 for SQL Server与版本17之间的破坏性变更。
大多数从版本17升级到版本18的应用程序只会受到一个变化的影响:连接默认加密。 如果升级后应用停止连接,先阅读 默认加密行为 。
更改摘要
| 区域 | 版本 17 | 版本18及以后版本 |
|---|---|---|
默认 Encrypt 设置 |
no |
yes |
Encrypt 公认的价值观 |
yes、no |
yes、no、Mandatory、Optional、Strict |
| 加密模式 | 开着还是开 | 关、开或严 |
| 服务器证书验证 | 除非你请求加密,否则不会发生 | 这是默认的,因为加密默认开启 |
| 连接字符串关键字 | 基础套装 | 基础集加上新关键词 |
加密更改
默认加密行为
在版本17中,除非你要求加密或服务器要求加密,否则连接不会加密。 在18版及以后版本中,连接默认加密。
由于驱动程序在加密连接时会验证服务器证书,因此连接自签名或其他不信任证书的应用程序在版本17时成功连接,在版本18时失败。 失败是证书验证错误,而非认证错误。
你有三种解决方式,从安全程度到安全性排序:
- 在客户端信任的服务器上安装证书。 这是推荐的选项,也是唯一同时保持加密和验证的。
- 保持加密状态,并通过设置
HostNameInCertificate或ServerCertificate告诉驱动程序验证哪个名称。 - 关闭加密可恢复17版默认值,方法是添加
Encrypt=no连接字符串(连接字符串)。
注意
设置 TrustServerCertificate=yes 保持连接加密,但禁用证书验证,使连接暴露于中间攻击者攻击的可能。 更倾向于使用可信证书。
加密值
版本17只 yes 接受和 no。 第18版及以后版本接受这些数值,并增加了三个:
| 价值 | 等效于 | Behavior |
|---|---|---|
Mandatory |
yes |
连接是加密的。 |
Optional |
no |
除非服务器要求,否则连接不会加密。 |
Strict |
没有 | 该连接采用TDS 8.0加密。 |
Strict 没有版本17的对应版本。 这是唯一选择TDS 8.0的数值,TDS 8.0在登录交换前协商加密,而非登录时。
恢复17版加密行为
要恢复17版默认行为,请明确设置 Encrypt :
Driver={ODBC Driver 18 for SQL Server};Server=<server>;Database=<database>;UID=<user_id>;PWD=<password>;Encrypt=no;
即使在版本17上,明确设置该值也很有益,因为这使连接字符串在两个版本中表现相同。
新的 连接字符串 关键字
版本18增加了以下连接字符串关键词,而版本17无法识别:
| 关键 字 | Purpose |
|---|---|
ConcatNullYieldsNull |
控制连接空值是否会得到空值。 |
GetDataExtensions |
控制驱动启用的 SQLGetData 扩展。 |
HostNameInCertificate |
指定主机名称,在服务器的TLS证书中验证。 |
IpAddressPreference |
指定驱动程序首先尝试的IP地址家族。 |
LongAsMax |
将长数据类型映射到其 max 对应数据。 |
RetryExec |
配置 针对失败查询的重试规则。 |
ServerCertificate |
指定用于验证服务器的证书文件路径。 |
不同的18版版本引入了单独的关键词。 关于引入每个关键词的版本,以及完整的关键词参考,请参见 ODBC DSN 和 连接字符串 关键字。