SQL Server 连接器维护与故障排除
适用范围:SQL Server
本文章提供了有关 SQL Server 连接器的补充信息。 有关 SQL Server 连接器的详细信息,请参阅使用 Azure 密钥保管库的可扩展密钥管理、使用 Azure 密钥保管库的可扩展密钥管理的设置步骤和使用具有 SQL 加密功能的 SQL Server 连接器。
注意
虽然 Microsoft Entra ID 是 Azure Active Directory (Azure AD) 的新名称,但为了防止中断现有环境,Azure AD 仍保留在一些硬编码的元素中,例如 UI 字段、连接提供程序、错误代码和 cmdlet。 在本文中,这两个名称可以互换。
A. SQL Server 连接器的维护说明
密钥轮换
Azure Key Vault 支持密钥轮换,这是创建新密钥并更新应用程序来使用新密钥的过程。 密钥轮换是一种安全最佳做法,可帮助保护数据以防密钥被盗用。 SQL Server 连接器支持密钥轮换。 不应删除旧密钥,因为可能需要使用旧密钥来还原数据库。 若要轮换密钥,请按照使用新的 AKV 密钥或新的 AKV 密钥版本来轮换非对称密钥中的步骤进行操作。
升级 SQL Server 连接器
已替换版本 1.0.0.440 和更早的版本,且生产环境不再支持这些版本。 生产环境中支持版本 1.0.1.0 和更高版本。 使用以下说明升级到 Microsoft 下载中心提供的最新版本。
升级
- 使用 SQL Server 配置管理器停止 SQL Server 服务
- 使用“控制面板”\“程序”\“程序和功能”卸载旧版本
- 应用程序名称:用于 Microsoft Azure Key Vault 的 SQL Server 连接器
- 版本:15.0.300.96(或更早版本)
- DLL 文件日期:2018/01/30(或更早)
- 安装(升级)用于 Microsoft Azure Key Vault 的 SQL Server 连接器的新版本
- 版本:15.0.2000.440
- DLL 文件日期:2020/09/11
- 启动 SQL Server 服务
- 测试能否访问加密数据库
回退
使用 SQL Server 配置管理器停止 SQL Server 服务
使用“控制面板”\“程序”\“程序和功能”卸载新版本
- 应用程序名称:用于 Microsoft Azure Key Vault 的 SQL Server 连接器
- 版本:15.0.2000.440
- DLL 文件日期:2020/11/24
安装用于 Microsoft Azure Key Vault 的 SQL Server 连接器的旧版本
- 版本: 15.0.300.96
- DLL 文件日期:2018/01/30
启动 SQL Server 服务
请检查使用 TDE 的数据库是否可访问
在验证更新是否有效之后,可以删除旧 SQL Server 连接器文件夹(如果在步骤 3 中选择将其重命名而不是卸载)
旧版 SQL Server 连接器
指向旧版 SQL Server 连接器的深层链接
- 当前:1.0.5.0(版本 15.0.2000.440)– 文件日期为 2020 年 11 月 24 日
- 1.0.5.0(版本 15.0.300.96)- 文件日期为 2018 年 1 月 30 日
- 1.0.4.0(版本 13.0.811.168)
滚动更新 SQL Server 服务主体
SQL Server 使用在 Microsoft Entra ID(以前称为 Azure Active Directory)中创建的服务主体作为凭据来访问密钥保管库。 服务主体具有客户端 ID 和身份验证密钥。 SQL Server 凭据是使用 VaultName、 客户端 ID 和身份验证密钥设置的。 身份验证密钥在特定的期限内有效(一年或两年)。 在期限到期之前,必须在 Microsoft Entra ID 中为服务主体生成新密钥。 然后,必须在 SQL Server 中更改凭据。 Management Studio 为当前会话中的凭据保留缓存,因此,如果凭据发生更改,Management Studio 应重新启动。
密钥备份和恢复
应定期备份密钥保管库。 如果保管库中的非对称密钥丢失,可以从备份还原它。 必须使用和以前相同的名称还原密钥,还原 PowerShell 命令会执行此操作(如下面步骤所示)。
如果保管库丢失,则需要重新创建一个保管库,并使用以前相同的名称将非对称密钥还原到保管库中。 保管库名称可以不同(也可与以前相同)。 设置对新保管库的访问权限,以授予 SQL Server 服务主体对 SQL Server 加密方案的所需访问权限,然后调整 SQL Server 凭据以反映新的保管库名称。
概括而言,步骤如下:
- 备份保管库密钥(使用 Backup-AzureKeyVaultKey PowerShell cmdlet)。
- 如果保管库出错,则在同一地理区域中创建新的保管库。 创建此保管库的用户应在为 SQL Server 设置的服务主体所在的同一默认目录中。
- 使用 Restore-AzureKeyVaultKey PowerShell cmdlet 将密钥还原到新保管库,这将使用和以前相同的名称还原密钥。 如果已经存在具有相同名称的密钥,还原将失败。
- 向 SQL Server 服务主体授予权限以使用此新的保管库。
- 修改数据库引擎使用的 SQL Server 凭据以反映新的保管库名称(如果需要)。
只要密钥备份保留在同一个地理区域或国家云,就可以跨 Azure 区域还原密钥备份,这些国家/地区包括:美国、加拿大、日本、澳大利亚、印度、APAC、欧洲、巴西、中国、美国政府或德国。
B. 常见问题
在 Azure 密钥保管库
密钥操作如何与 Azure 密钥保管库配合使用?
密钥保管库中的非对称密钥用于保护 SQL Server 加密密钥。 仅非对称密钥的公共部分会离开保管库,其私有部分绝不会由保管库导出。 使用非对称密钥的所有加密操作都委托给了 Azure Key Vault 服务,并受到该服务的安全性的保护。
什么是密钥 URI?
Azure 密钥保管库中的所有密钥都有一个统一资源标识符 (URI),你可以使用它在应用程序中引用密钥。 使用格式 https://ContosoKeyVault.vault.azure.net/keys/ContosoFirstKey
可获取当前版本,使用 https://ContosoKeyVault.vault.azure.net/keys/ContosoFirstKey/cgacf4f763ar42ffb0a1gca546aygd87
可获取特定的版本。
配置 SQL Server
SQL Server 连接器需要拥有对什么终结点的访问权限? 该连接器与两个终结点通信,这两个终结点需要获得允许。 与这些其他服务进行出站通信所需的唯一端口是 443(用于 Https):
- login.microsoftonline.com/*:443
- .vault.azure.net/:443
此外,检查证书吊销列表可能在端口 80 上产生 HTTP 流量。
注意
如果流量被延迟或阻止,则使用防火墙或代理服务器后面的用于 Azure Key Vault 的 SQL Server 连接器可能会影响性能。 熟悉访问防火墙后面的 Azure 密钥保管库,确保制定正确的规则。
如何通过 HTTP(S) 代理服务器连接到 Azure Key Vault? 连接器使用 Internet Explorer 的代理配置设置。 这些设置可通过组策略 或注册表控制,但需要注意的是,这些设置不是系统范围的设置,而是针对运行 SQL Server 实例的服务帐户。 如果数据库管理员在 Internet Explorer 中查看或编辑设置,则它们只会影响数据库管理员的帐户,而不会影响 SQL Server 引擎。 不建议使用服务帐户以交互的方式登录到服务器,并且在许多安全环境中都会阻止该方式。 对配置的代理设置进行更改可能需要重启 SQL Server 实例才能生效,因为当连接器首次尝试连接到密钥保管库时,将缓存这些设置。
SQL Server 连接器支持 Azure Key Vault 中的哪些密钥大小? 最新版本的 SQL Server 连接器支持大小为 2048 和 3072 的 Azure Key Vault 密钥。
注意
即使使用的密钥大小为 3072,“sys.asymmetric_keys
”视图也会将密钥大小报告为 2048。 这是此视图的已知漏洞,SQL Server 产品团队将在未来版本中解决此问题。
SQL Server 中每个配置步骤所需的最低权限级别是什么?
尽管你可以使用 sysadmin 固定服务器角色成员的身份执行所有配置步骤,但 Microsoft 建议你尽量使用最少的权限。 以下列表定义了每个操作的最小权限级别。
若要创建加密提供程序,需要具备
CONTROL SERVER
权限或 sysadmin 固定服务器角色的成员身份。若要更改配置选项并运行
RECONFIGURE
语句,你必须具有ALTER SETTINGS
服务器级别权限。ALTER SETTINGS
权限由 sysadmin 和 serveradmin 固定服务器角色隐式持有。若要创建凭据,需要具备
ALTER ANY CREDENTIAL
权限。若要向登录名添加凭据,需要具备
ALTER ANY LOGIN
权限。若要创建非对称密钥,需要具备
CREATE ASYMMETRIC KEY
权限。
如何更改我的默认 Microsoft Entra 目录,以便在与为 SQL Server 连接器创建的服务主体相同的订阅和目录中创建密钥保管库?
转到 Azure 门户。
在页面的右上角,选择设置图标或你的用户配置文件。
在“目录 + 订阅”页上,选择“所有目录”以查看所属的所有 Microsoft Entra 目录。
可以更改启动目录,或者如果有多个目录,可以切换到其他目录。
注意
你可能没有对 Azure 订阅实际更改默认目录的权限。 在这种情况下,请在默认目录中创建 Microsoft Entra 服务主体,以便其处于与以后使用的 Azure 密钥保管库相同的目录中。
要了解有关 Microsoft Entra ID 的更多信息,请阅读Azure 订阅与 Microsoft Entra ID 相关的方式。
°C SQL Server 连接器的错误代码说明
注意
虽然 Microsoft Entra ID 是 Azure Active Directory (Azure AD) 的新名称,但为了防止中断现有环境,Azure AD 仍保留在一些硬编码的元素中,例如 UI 字段、连接提供程序、错误代码和 cmdlet。 在本文中,这两个名称可以互换。
提供程序错误代码:
错误代码 | 符号 | 说明 |
---|---|---|
0 | scp_err_Success | 操作已成功执行。 |
1 | scp_err_Failure | 操作失败。 |
2 | scp_err_InsufficientBuffer | 该错误通知引擎为缓冲区分配更多内存。 |
3 | scp_err_NotSupported | 此操作不受支持。 例如,EKM 提供程序不支持指定的密钥类型或算法。 |
4 | scp_err_NotFound | EKM 提供程序找不到指定的密钥或算法。 |
5 | scp_err_AuthFailure | EKM 提供程序的身份验证失败。 |
6 | scp_err_InvalidArgument | 提供的参数无效。 |
7 | scp_err_ProviderError | EKM 提供程序中发生了 SQL 引擎捕获到的未知错误。 |
401 | acquireToken | 服务器已针对请求响应代码 401。 请确保客户端 ID 和密码正确,并且凭据字符串是 AAD 客户端 ID 和密码的串联(无连字符)。 |
404 | getKeyByName | 服务器响应 404,因为找不到密钥名称。 请确保保管库中存在密钥名称。 |
2049 | scp_err_KeyNameDoesNotFitThumbprint | 密钥名称太长,不适用于 SQL 引擎的指纹。 密钥名称不得超过 26 个字符。 |
2050 | scp_err_PasswordTooShort | 作为 AAD 客户端 ID 和密码的串联的密码字符串少于 32 个字符。 |
2051 | scp_err_OutOfMemory | SQL 引擎内存不足,无法为 EKM 提供程序分配内存。 |
2052 | scp_err_ConvertKeyNameToThumbprint | 无法将密钥名称转换为指纹。 |
2053 | scp_err_ConvertThumbprintToKeyName | 无法将指纹转换为密钥名称。 |
2057 | scp_err_ThumbprintExistedInRegistry | Windows 注册表中已存在映射到其他密钥 URI 的密钥指纹。 |
2058 | scp_err_FailureInRegistry | 无法在注册表中执行该操作。 SQL Server 服务帐户没有创建注册表项的权限。 |
3000 | ErrorSuccess | AKV 操作已成功。 |
3001 | ErrorUnknown | AKV 操作失败,并出现未知错误。 |
3002 | ErrorHttpCreateHttpClientOutOfMemory | 由于内存不足,无法为 AKV 操作创建 HttpClient。 |
3003 | ErrorHttpOpenSession | 由于网络错误,无法打开 Http 会话。 |
3004 | ErrorHttpConnectSession | 由于网络错误,无法连接 Http 会话。 |
3005 | ErrorHttpAttemptConnect | 由于网络错误,无法尝试连接。 |
3006 | ErrorHttpOpenRequest | 由于网络错误,无法打开请求。 |
3007 | ErrorHttpAddRequestHeader | 无法添加请求标头。 |
3008 | ErrorHttpSendRequest | 由于网络错误,无法发送请求。 |
3009 | ErrorHttpGetResponseCode | 由于网络错误,无法获取响应代码。 |
3010 | ErrorHttpResponseCodeUnauthorized | 服务器已针对请求响应代码 401。 |
3011 | ErrorHttpResponseCodeThrottled | 服务器已限制请求。 |
3012 | ErrorHttpResponseCodeClientError | 从连接器发送的请求无效。 这通常意味着密钥名称无效或包含无效字符。 |
3013 | ErrorHttpResponseCodeServerError | 服务器响应的响应代码介于 500 和 600 之间。 |
3014 | ErrorHttpQueryHeader | 无法查询响应标头。 |
3015 | ErrorHttpQueryHeaderOutOfMemoryCopyHeader | 由于内存不足,无法复制响应标头。 |
3016 | ErrorHttpQueryHeaderOutOfMemoryReallocBuffer | 重新分配缓冲区时,由于内存不足无法查询响应标头。 |
3017 | ErrorHttpQueryHeaderNotFound | 在响应中找不到查询标头。 |
3018 | ErrorHttpQueryHeaderUpdateBufferLength | 查询响应标头时无法更新缓冲区长度。 |
3019 | ErrorHttpReadData | 由于网络错误,无法读取响应数据。 |
3076 | ErrorHttpResourceNotFound | 服务器响应 404,因为找不到密钥名称。 确保保管库中存在密钥名称。 |
3077 | ErrorHttpOperationForbidden | 服务器响应 403,因为用户没有执行操作的正确权限。 确保你具有用于指定操作的权限。 连接器至少需要“get、list、wrapKey、unwrapKey”权限才能正常运行。 |
3100 | ErrorHttpCreateHttpClientOutOfMemory | 由于内存不足,无法为 AKV 操作创建 HttpClient。 |
3101 | ErrorHttpOpenSession | 由于网络错误,无法打开 Http 会话。 |
3102 | ErrorHttpConnectSession | 由于网络错误,无法连接 Http 会话。 |
3103 | ErrorHttpAttemptConnect | 由于网络错误,无法尝试连接。 |
3104 | ErrorHttpOpenRequest | 由于网络错误,无法打开请求。 |
3105 | ErrorHttpAddRequestHeader | 无法添加请求标头。 |
3106 | ErrorHttpSendRequest | 由于网络错误,无法发送请求。 |
3107 | ErrorHttpGetResponseCode | 由于网络错误,无法获取响应代码。 |
3108 | ErrorHttpResponseCodeUnauthorized | 服务器已针对请求响应代码 401。 请确保客户端 ID 和密码正确,并凭据字符串是 AAD 客户端 ID 和密码的串联(无连字符)。 |
3109 | ErrorHttpResponseCodeThrottled | 服务器已限制请求。 |
3110 | ErrorHttpResponseCodeClientError | 请求无效。 这通常意味着密钥名称无效或包含无效字符。 |
3111 | ErrorHttpResponseCodeServerError | 服务器响应的响应代码介于 500 和 600 之间。 |
3112 | ErrorHttpResourceNotFound | 服务器响应 404,因为找不到密钥名称。 请确保保管库中存在密钥名称。 |
3113 | ErrorHttpOperationForbidden | 服务器响应 403,因为用户没有执行操作的正确权限。 请确保你具有用于指定操作的权限。 至少需要“get、wrapKey、unwrapKey”权限。 |
3114 | ErrorHttpQueryHeader | 无法查询响应标头。 |
3115 | ErrorHttpQueryHeaderOutOfMemoryCopyHeader | 由于内存不足,无法复制响应标头。 |
3116 | ErrorHttpQueryHeaderOutOfMemoryReallocBuffer | 重新分配缓冲区时,由于内存不足无法查询响应标头。 |
3117 | ErrorHttpQueryHeaderNotFound | 在响应中找不到查询标头。 |
3118 | ErrorHttpQueryHeaderUpdateBufferLength | 查询响应标头时无法更新缓冲区长度。 |
3119 | ErrorHttpReadData | 由于网络错误,无法读取响应数据。 |
3120 | ErrorHttpGetResponseOutOfMemoryCreateTempBuffer | 创建临时缓冲区时,由于内存不足而无法获取响应正文。 |
3121 | ErrorHttpGetResponseOutOfMemoryGetResultString | 获取结果字符串时,由于内存不足而无法获取响应正文。 |
3122 | ErrorHttpGetResponseOutOfMemoryAppendResponse | 追加响应时,由于内存不足而无法获取响应正文。 |
3200 | ErrorGetAADValuesOutOfMemoryConcatPath | 串联路径时,由于内存不足而无法获取 Azure Active Directory 质询标头值。 |
3201 | ErrorGetAADDomainUrlStartPosition | 在格式不正确的响应质询标头中找不到 Azure Active Directory 域 URL 的开始位置。 |
3202 | ErrorGetAADDomainUrlStopPosition | 在格式不正确的响应质询标头中找不到 Azure Active Directory 域 URL 的结束位置。 |
3203 | ErrorGetAADDomainUrlMalformatted | Azure Active Directory 响应质询标头的格式不正确,并且不包含 AAD 域 URL。 |
3204 | ErrorGetAADDomainUrlOutOfMemoryAlloc | 为 Azure Active Directory 域 URL 分配缓冲区时内存不足。 |
3205 | ErrorGetAADTenantIdOutOfMemoryAlloc | 为 Azure Active Directory 租户 ID 分配缓冲区时内存不足。 |
3206 | ErrorGetAKVResourceUrlStartPosition | 在格式不正确的响应质询标头中找不到 Azure Key Vault 资源 URL 的开始位置。 |
3207 | ErrorGetAKVResourceUrlStopPosition | 在格式不正确的响应质询标头中找不到 Azure Key Vault 资源 URL 的结束位置。 |
3208 | ErrorGetAKVResourceUrlOutOfMemoryAlloc | 为 Azure Key Vault 资源 URL 分配缓冲区时内存不足。 |
3300 | ErrorGetTokenOutOfMemoryConcatPath | 串联请求路径时,由于内存不足而无法获取令牌。 |
3301 | ErrorGetTokenOutOfMemoryConcatBody | 串联响应正文时,由于内存不足而无法获取令牌。 |
3302 | ErrorGetTokenOutOfMemoryConvertResponseString | 转换响应字符串时,由于内存不足而无法获取令牌。 |
3303 | ErrorGetTokenBadCredentials | 由于凭据不正确,无法获取令牌。 请确保凭据字符串或证书有效。 |
3304 | ErrorGetTokenFailedToGetToken | 凭据正确时,操作仍无法获取有效的令牌。 |
3305 | ErrorGetTokenRejected | 令牌有效,但被服务器拒绝。 |
3306 | ErrorGetTokenNotFound | 在响应中找不到令牌。 |
3307 | ErrorGetTokenJsonParser | 无法解析服务器的 JSON 响应。 |
3308 | ErrorGetTokenExtractToken | 无法从 JSON 响应中提取令牌。 |
3400 | ErrorGetKeyByNameOutOfMemoryConvertResponseString | 转换响应字符串时,由于内存不足而无法获取密钥。 |
3401 | ErrorGetKeyByNameOutOfMemoryConcatPath | 串联路径时,由于内存不足而无法获取密钥。 |
3402 | ErrorGetKeyByNameOutOfMemoryConcatHeader | 串联标头时,由于内存不足而无法获取密钥。 |
3403 | ErrorGetKeyByNameNoResponse | 由于服务器没有响应,无法按名称获取密钥。 |
3404 | ErrorGetKeyByNameJsonParser | 由于分析 JSON 响应失败,无法按名称获取密钥。 |
3405 | ErrorGetKeyByNameExtractKeyNode | 由于从响应中提取密钥节点失败,无法按名称获取密钥。 |
3406 | ErrorGetKeyByNameExtractKeyId | 由于从响应中提取密钥 ID 失败,无法按名称获取密钥。 |
3407 | ErrorGetKeyByNameExtractKeyType | 由于从响应中提取密钥类型失败,无法按名称获取密钥。 |
3408 | ErrorGetKeyByNameExtractKeyN | 由于从响应中提取密钥 N 失败,无法按名称获取密钥。 |
3409 | ErrorGetKeyByNameBase64DecodeN | 由于对 N 进行 Base64 解码失败,无法按名称获取密钥。 |
3410 | ErrorGetKeyByNameExtractKeyE | 由于从响应中提取密钥 E 失败,无法按名称获取密钥。 |
3411 | ErrorGetKeyByNameBase64DecodeE | 由于对 E 进行 Base64 解码失败,无法按名称获取密钥。 |
3412 | ErrorGetKeyByNameExtractKeyUri | 无法从响应中提取密钥 URI。 |
3500 | ErrorBackupKeyOutOfMemoryConvertResponseString | 转换响应字符串时,由于内存不足而无法备份密钥。 |
3501 | ErrorBackupKeyOutOfMemoryConcatPath | 串联路径时,由于内存不足而无法备份密钥。 |
3502 | ErrorBackupKeyOutOfMemoryConcatHeader | 串联请求标头时,由于内存不足而无法备份密钥。 |
3503 | ErrorBackupKeyNoResponse | 由于服务器没有响应,因此无法备份密钥。 |
3504 | ErrorBackupKeyJsonParser | 由于分析 JSON 响应失败,无法备份密钥。 |
3505 | ErrorBackupKeyExtractValue | 由于从 JSON 响应中提取值失败,无法备份密钥。 |
3506 | ErrorBackupKeyBase64DecodeValue | 由于对值字段进行 Base64 解码失败,无法备份密钥。 |
3600 | ErrorWrapKeyOutOfMemoryConvertResponseString | 转换响应字符串时,由于内存不足而无法包装密钥。 |
3601 | ErrorWrapKeyOutOfMemoryConcatPath | 串联路径时,由于内存不足而无法包装密钥。 |
3602 | ErrorWrapKeyOutOfMemoryConcatHeader | 串联标头时,由于内存不足而无法包装密钥。 |
3603 | ErrorWrapKeyOutOfMemoryConcatBody | 串联正文时,由于内存不足而无法包装密钥。 |
3604 | ErrorWrapKeyOutOfMemoryConvertEncodedBody | 转换已编码的正文时,由于内存不足而无法包装密钥。 |
3605 | ErrorWrapKeyBase64EncodeKey | 由于对密钥进行 Base64 编码失败,无法包装密钥。 |
3606 | ErrorWrapKeyBase64DecodeValue | 由于对响应值进行 Base64 解码失败,无法包装密钥。 |
3607 | ErrorWrapKeyJsonParser | 由于分析 JSON 响应失败,无法包装密钥。 |
3608 | ErrorWrapKeyExtractValue | 由于从响应中提取值失败,无法包装密钥。 |
3609 | ErrorWrapKeyNoResponse | 由于服务器没有响应,无法包装密钥。 |
3700 | ErrorUnwrapKeyOutOfMemoryConvertResponseString | 转换响应字符串时,由于内存不足而无法解包密钥。 |
3701 | ErrorUnwrapKeyOutOfMemoryConcatPath | 串联路径时,由于内存不足而无法解包密钥。 |
3702 | ErrorUnwrapKeyOutOfMemoryConcatHeader | 串联标头时,由于内存不足而无法解包密钥。 |
3703 | ErrorUnwrapKeyOutOfMemoryConcatBody | 串联正文时,由于内存不足而无法解包密钥。 |
3704 | ErrorUnwrapKeyOutOfMemoryConvertEncodedBody | 转换已编码的正文时,由于内存不足而无法解包密钥。 |
3705 | ErrorUnwrapKeyBase64EncodeKey | 由于对密钥进行 Base64 编码失败,无法解包密钥。 |
3706 | ErrorUnwrapKeyBase64DecodeValue | 由于对响应值进行 Base64 解码失败,无法解包密钥。 |
3707 | ErrorUnwrapKeyJsonParser | 由于从响应中提取值失败,无法解包密钥。 |
3708 | ErrorUnwrapKeyExtractValue | 由于从响应中提取值失败,无法解包密钥。 |
3709 | ErrorUnwrapKeyNoResponse | 由于服务器没有响应,无法解包密钥。 |
3800 | ErrorSecretAuthParamsGetRequestBody | 使用 AAD 客户端 ID 和密码创建请求正文时出错。 |
3801 | ErrorJWTTokenCreateHeader | 创建 JWT 令牌标头以使用 AAD 进行身份验证时出错。 |
3802 | ErrorJWTTokenCreatePayloadGUID | 为 JWT 令牌有效负载创建 GUID 以使用 AAD 进行身份验证时出错。 |
3803 | ErrorJWTTokenCreatePayload | 创建 JWT 令牌有效负载以使用 AAD 进行身份验证时出错。 |
3804 | ErrorJWTTokenCreateSignature | 创建 JWT 令牌签名以使用 AAD 进行身份验证时出错。 |
3805 | ErrorJWTTokenSignatureHashAlg | 获取 SHA256 哈希算法以使用 AAD 进行身份验证时出错。 |
3806 | ErrorJWTTokenSignatureHash | 创建 SHA256 哈希以使用 AAD 进行 JWT 令牌身份验证时出错。 |
3807 | ErrorJWTTokenSignatureSignHash | 对 JWT 令牌哈希签名以使用 AAD 进行身份验证时出错。 |
3808 | ErrorJWTTokenCreateToken | 创建 JWT 令牌以使用 AAD 进行身份验证时出错。 |
3809 | ErrorPfxCertAuthParamsImportPfx | 导入 PFX 证书以使用 AAD 进行身份验证时出错。 |
3810 | ErrorPfxCertAuthParamsGetThumbprint | 从 PFX 证书中获取指纹以使用 AAD 进行身份验证时出错。 |
3811 | ErrorPfxCertAuthParamsGetPrivateKey | 从 PFX 证书中获取私钥以使用 AAD 进行身份验证时出错。 |
3812 | ErrorPfxCertAuthParamsSignAlg | 获取 RSA 签名算法以使用 AAD 进行 PFX 证书身份验证时出错。 |
3813 | ErrorPfxCertAuthParamsImportForSign | 导入用于 RSA 签名的 PFX 私钥以使用 AAD 进行身份验证时出错。 |
3814 | ErrorPfxCertAuthParamsCreateRequestBody | 从 PFX 证书创建请求正文以使用 AAD 进行身份验证时出错。 |
3815 | ErrorPEMCertAuthParamsGetThumbprint | 对指纹进行 Base64 解码以使用 AAD 进行身份验证时出错。 |
3816 | ErrorPEMCertAuthParamsGetPrivateKey | 从 PEM 中获取 RSA 私钥以使用 AAD 进行身份验证时出错。 |
3817 | ErrorPEMCertAuthParamsSignAlg | 获取 RSA 签名算法以使用 AAD 进行 PEM 私钥身份验证时出错。 |
3818 | ErrorPEMCertAuthParamsImportForSign | 导入用于 RSA 签名的 PEM 私钥以使用 AAD 进行身份验证时出错。 |
3819 | ErrorPEMCertAuthParamsCreateRequestBody | 从 PEM 私钥创建请求正文以使用 AAD 进行身份验证时出错。 |
3820 | ErrorLegacyPrivateKeyAuthParamsSignAlg | 获取 RSA 签名算法以使用 AAD 进行旧私钥身份验证时出错。 |
3821 | ErrorLegacyPrivateKeyAuthParamsImportForSign | 导入用于 RSA 签名的旧私钥以使用 AAD 进行身份验证时出错。 |
3822 | ErrorLegacyPrivateKeyAuthParamsCreateRequestBody | 从旧私钥创建请求正文以使用 AAD 进行身份验证时出错。 |
3900 | ErrorAKVDoesNotExist | 未解析 Internet 名称的错误。 这通常表示删除了 Azure Key Vault。 |
4000 | ErrorCreateKeyVaultRetryManagerOutOfMemory | 由于内存不足,无法为 AKV 操作创建 RetryManager。 |
如果未在此表中看到你的错误代码,以下是发生此错误的一些其他原因:
你可能无法访问 Internet,以及无法访问 Azure Key Vault。 请检查 Internet 连接。
Azure 密钥保管库服务可能已关闭。 另选时间重试一次。
你可能已从 Azure 密钥保管库或 SQL Server 中删除非对称密钥。 还原此密钥。
如果收到“无法加载库”的错误消息,请确保根据正在运行的 SQL Server 版本已安装了适当的 Visual Studio C++ 可再发行版。 下表指定了应从 Microsoft 下载中心安装的版本。
Windows 事件日志还会记录与 SQL Server 连接器相关的错误,这有助于了解为何其他上下文也会出现这些错误。 Windows 应用程序事件日志中的源将为“用于 Microsoft Azure Key Vault 的 SQL Server 连接器”。
适用于 SQL Server 连接器 1.0.5.0 的 C++ 运行时库
SQL Server 版本 | 可再发行组件安装链接(如果使用 SQL Server 连接器 1.0.5.0) |
---|---|
2008、2008 R2、2012、2014 | Visual C++ Redistributable Packages for Visual Studio 2013 |
2016、2017、2019 | Visual C++ Redistributable for Visual Studio 2015 |
适用于 SQL Server 连接器 1.0.4.0 的 C++ 运行时库
SQL Server 版本 | 可再发行组件安装链接(如果使用 SQL Server 连接器 1.0.4.0) |
---|---|
2008、2008 R2、2012、2014、2016、2017、2019 | Visual C++ Redistributable Packages for Visual Studio 2013 |
其他参考
有关可扩展密钥管理的更多信息:
支持 EKM 的 SQL 加密:
相关的 Transact-SQL 命令:
Azure 密钥保管库文档:
PowerShell Azure 密钥保管库 Cmdlet 参考