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 下载中心提供的最新版本。

升级

  1. 使用 SQL Server 配置管理器停止 SQL Server 服务
  2. 使用“控制面板”\“程序”\“程序和功能”卸载旧版本
    1. 应用程序名称:用于 Microsoft Azure Key Vault 的 SQL Server 连接器
    2. 版本:15.0.300.96(或更早版本)
    3. DLL 文件日期:2018/01/30(或更早)
  3. 安装(升级)用于 Microsoft Azure Key Vault 的 SQL Server 连接器的新版本
    1. 版本:15.0.2000.440
    2. DLL 文件日期:2020/09/11
  4. 启动 SQL Server 服务
  5. 测试能否访问加密数据库

回退

  1. 使用 SQL Server 配置管理器停止 SQL Server 服务

  2. 使用“控制面板”\“程序”\“程序和功能”卸载新版本

    1. 应用程序名称:用于 Microsoft Azure Key Vault 的 SQL Server 连接器
    2. 版本:15.0.2000.440
    3. DLL 文件日期:2020/11/24
  3. 安装用于 Microsoft Azure Key Vault 的 SQL Server 连接器的旧版本

    1. 版本: 15.0.300.96
    2. DLL 文件日期:2018/01/30
  4. 启动 SQL Server 服务

  5. 请检查使用 TDE 的数据库是否可访问

  6. 在验证更新是否有效之后,可以删除旧 SQL Server 连接器文件夹(如果在步骤 3 中选择将其重命名而不是卸载)

旧版 SQL Server 连接器

指向旧版 SQL Server 连接器的深层链接

滚动更新 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 连接器创建的服务主体相同的订阅和目录中创建密钥保管库?

屏幕截图,其中显示了 Microsoft Entra ID 更改默认目录的帮助步骤。

  1. 转到 Azure 门户

  2. 在页面的右上角,选择设置图标或你的用户配置文件。

  3. 在“目录 + 订阅”页上,选择“所有目录”以查看所属的所有 Microsoft Entra 目录。

  4. 可以更改启动目录,或者如果有多个目录,可以切换到其他目录。

    注意

    你可能没有对 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 无法将指纹转换为密钥名称。
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 密钥保管库文档: