本文介绍适用于 SQL Server 和早期版本的 Microsoft OLE DB Driver 19 之间的中断性变更。
小窍门
MSOLEDBSQL19 (Microsoft OLE DB Driver 19 for SQL Server)是当前推荐的 OLE DB 驱动程序。 它支持 TDS 8.0 和现代安全功能。 19.2.0 及以后版本也支持 TLS 1.3。 在 Provider=MSOLEDBSQL19 连接字符串中使用。
更改摘要
| Area | 版本18及更早版本 | 版本19及以后版本 |
|---|---|---|
默认加密 (Encrypt) 设置 |
no (无加密或服务器需要加密) |
Mandatory (需要加密) |
Encrypt 属性类型 |
VT_BOOL |
VT_BSTR |
Encrypt 有效值 |
no/yes |
no/yes/true/false/Optional/Mandatory/Strict |
| 证书验证 | 客户端集时跳过 Encrypt=no |
加密发生时始终评估 |
| 驱动程序名称 | MSOLEDBSQL |
MSOLEDBSQL19 |
| CLSID |
MSOLEDBSQL_CLSID(旧版) |
MSOLEDBSQL_CLSID (在标头中更新) |
警告
ActiveDirectoryPassword 身份验证已弃用。 如果要从版本 18 迁移到 19 并使用 Authentication=ActiveDirectoryPassword,请计划迁移到更安全的身份验证方法。 有关替代 方法,请参阅弃用的身份验证方法 。
加密属性更改
加密属性类型更改
驱动程序属性 SSPROP_INIT_ENCRYPT 从 VT_BOOL 此更改为 VT_BSTR.
| 连接字符串 | 版本 18 值 | 版本 19 值 |
|---|---|---|
供应商: Encrypt |
no/yes |
no/yes/true/false/Optional/Mandatory/Strict |
IDataInitialize: Use Encryption for Data |
true/false |
no/yes/true/false/Optional/Mandatory/Strict |
值映射:
| 模式 | 等效值 | 行为 |
|---|---|---|
Optional |
no、false |
未加密,除非服务器需要它 |
Mandatory(默认值) |
yes、true |
需要加密连接 |
Strict |
(无等效项) | TDS 8.0 加密;需要 SQL Server 2022 及更高版本 |
小窍门
从版本 19.2.0 开始,连接到 SQL Server 2022 或更高版本时,TDS 8.0 连接可以使用 TLS 1.3。 此版本中还添加了该 ServerCertificate 属性。 有关详细信息,请参阅 TLS 1.3 支持。
为了向后兼容,版本 19 除了新值(yes/no)外,还接受所有版本 18 值()。Optional/Mandatory/Strict
默认加密行为
| 版本 | 违约 | 结果 |
|---|---|---|
| 18及更早版本 | no |
默认情况下未加密的连接 |
| 19 及更高版本 | Mandatory |
默认情况下加密的连接 |
若要还原版本 18 行为,请将以下选项之一添加到连接字符串:
- 供应商:
Encrypt=Optional; - IDataInitialize:
Use Encryption for Data=Optional;
证书验证行为
| Scenario | 版本 18 | 版本19及以后版本 |
|---|---|---|
客户端集 Encrypt=no,服务器不强制加密 |
无验证 | 无验证 |
客户端集 Encrypt=no,服务器强制加密 |
Trust Server Certificate
忽视 |
Trust Server Certificate
评价 |
客户端集 Encrypt=yes |
Trust Server Certificate 评价 |
Trust Server Certificate 评价 |
兼容性说明
当服务器强制加密并使用不受信任的证书时,使用默认设置的版本 19 客户端无法连接。 更新设置 Trust Server Certificate 或使用受信任的证书。
TrustServerCertificate
未在版本 19 中删除。 该选项仍然有效。 版本 18 在设置为Encrypt此设置时no忽略此设置,即使服务器强制加密也是如此。 版本 19 现在在所有加密方案中进行评估 TrustServerCertificate 。
版本 19 驱动程序在 19.4.1 之前存在安装程序问题,可将注册表选项设置为TrustServerCertificateno以前安装了 v18 的系统上。 发生此问题时,驱动程序将使用更安全的注册表设置,这可能会使连接字符串选项似乎不起作用。 此问题已在版本 19.4.1 中解决。 v19(没有 v18 存在的)的全新安装始终正确默认为注册表选项 yes。 有关详细信息,请参阅 注册表设置。
关键字格式因接口而异:
- 提供程序连接字符串不使用空格:
TrustServerCertificate=yes; - IDataInitialize 连接字符串使用空格:
Trust Server Certificate=yes;
有关详细信息,请参阅 OLE DB 中的加密和证书验证。
强制协议加密的注册表设置
强制协议加密注册表设置使用映射到加密模式的数值:
| 注册表值 | 加密模式 | Description |
|---|---|---|
0 |
Optional |
仅当服务器需要加密时加密 |
1 |
Mandatory |
需要加密 |
2 |
Strict |
TDS 8.0 加密 |
驱动程序使用注册表设置和连接属性之间的最安全选项。 有关注册表项位置,请参阅 注册表设置。
驱动程序名称更改
版本 19 支持版本 18 的并行安装。 驱动程序名称包括用于区分的主要版本号。
| 接口 | 版本 18 | 版本 19 |
|---|---|---|
| 提供程序关键字 | MSOLEDBSQL |
MSOLEDBSQL19 |
| CLSID 常量 | MSOLEDBSQL_CLSID |
MSOLEDBSQL_CLSID(已更新)msoledbsql.h |
| UI 显示名称 | 适用于 SQL Server 的 Microsoft OLE DB 驱动程序 | Microsoft OLE DB Driver 19 for SQL Server |
迁移步骤
- 在项目中包括更新
msoledbsql.h的标头。 - 对于
IDBInitialize:不需要更改(标头中更新了 CLSID)。 - 对于
IDataInitialize:更改为Provider=MSOLEDBSQLProvider=MSOLEDBSQL19。 - 对于 UI 工具(SSMS,数据链接属性):选择 Microsoft OLE DB Driver 19 for SQL Server。
连接字符串示例
版本 18(之前):
Provider=MSOLEDBSQL;Server=myserver;Database=mydb;Trusted_Connection=yes;
版本 19(之后):
Provider=MSOLEDBSQL19;Server=myserver;Database=mydb;Trusted_Connection=yes;
具有显式加密设置的版本 19:
Provider=MSOLEDBSQL19;Server=myserver;Database=mydb;Encrypt=Mandatory;TrustServerCertificate=no;
版本 19 具有严格加密(TDS 8.0):
Provider=MSOLEDBSQL19;Server=myserver;Database=mydb;Encrypt=Strict;ServerCertificate=C:\certs\server.cer;
新版本 19 属性
版本 19 引入了使用加密模式进行增强证书验证 Strict 的属性。
HostNameInCertificate(v19.0.0及更高版本)
指定要根据服务器的 TLS/SSL 证书进行验证的主机名。 当连接字符串中的服务器名称不同于证书的公用名(CN)或使用者可选名称(SAN)时,请使用此属性。
| 接口 | 资产 |
|---|---|
| 提供程序关键字 | HostNameInCertificate |
| IDataInitialize 关键字 | Host Name In Certificate |
| OLE DB 属性 | SSPROP_INIT_HOST_NAME_CERTIFICATE |
注释
启用时 Trust Server Certificate 将忽略此属性。 当 Encrypt=Strict,证书始终得到验证。
ServerCertificate(v19.2.0及以后版本)
指定证书文件(PEM、DER 或 CER 格式)的路径,以便进行确切的证书匹配。 驱动程序在 TLS 握手期间将此证书与服务器的证书进行比较。
| 接口 | 资产 |
|---|---|
| 提供程序关键字 | ServerCertificate |
| IDataInitialize 关键字 | Server Certificate |
| OLE DB 属性 | SSPROP_INIT_SERVER_CERTIFICATE |
重要
ServerCertificate只能在 .Encrypt=Strict 尝试将其用于 Mandatory 或 Optional 加密会导致连接错误。
弃用的身份验证方法
ActiveDirectoryPassword
ActiveDirectoryPassword身份验证方法(Microsoft Entra ID 密码身份验证)已弃用。 此身份验证基于 OAuth 2.0 资源所有者密码凭据(ROPC)授予,该授权与多重身份验证(MFA)不兼容,并构成安全风险。
警告
Microsoft正远离此高风险身份验证流,以保护用户免受恶意攻击。 在删除此选项之前,计划迁移到更安全的身份验证方法。 有关详细信息,请参阅 规划 Azure 的强制多重身份验证。
建议的替代项
| Scenario | 建议的身份验证 | 连接字符串关键字 |
|---|---|---|
| 交互式用户上下文 | 多重身份验证 | Authentication=ActiveDirectoryInteractive |
| 在 Azure 上运行的应用 | 托管身份 | Authentication=ActiveDirectoryMSI |
| 不带用户的服务/守护程序 | 服务主体 | Authentication=ActiveDirectoryServicePrincipal |
有关详细信息,请参阅 使用 Microsoft Entra ID。
Troubleshooting
连接失败并出现证书验证错误
症状:连接失败,并出现证书验证错误或不受信任的证书消息。
原因:版本 19 默认为 Encrypt=Mandatory,这需要有效的服务器证书。 版本 18 默认为 Encrypt=no (未加密)。
解决方法:
- 建议:在服务器上安装受信任的证书。
-
仅开发:添加到
TrustServerCertificate=yes;连接字符串(不建议用于生产)。 -
回退:添加到
Encrypt=Optional;还原版本 18 行为(减少安全性)。
连接失败,并显示“服务器证书只能用于严格加密”
症状:使用 ServerCertificate 属性时连接失败。
原因:属性 ServerCertificate 需要 Encrypt=Strict。
解决方案:从连接字符串中删除 ServerCertificate 或更改为 Encrypt=Strict;。
设置 Encrypt 属性时,应用程序收到VT_BOOL错误
症状:使用布尔值设置 SSPROP_INIT_ENCRYPT 失败。
原因:版本 19 将属性类型从 VT_BOOL 更改为 VT_BSTR。
解决方案:使用字符串值("Mandatory"、、"Optional""Strict"、、"yes""no")而不是布尔值。
升级后找不到提供程序
症状:应用程序失败,出现“找不到提供程序”或类似错误。
原因:版本 19 使用不同的提供程序名称(MSOLEDBSQL19)。
解决方法:
- 将连接字符串更新
Provider=MSOLEDBSQL为Provider=MSOLEDBSQL19. - 如果与 CLSID 一
msoledbsql.h起使用,请包含更新IDBInitialize的标头。