使用Azure Data Factory迁移SQL Server加密表至Azure SQL遇解密故障
问题分析与解决办法
错误22301:CurrentUser证书存储找不到指定指纹证书
原因
Azure Data Factory(ADF)的Copy活动运行在Azure托管环境或自托管集成运行时(IR)环境,无法直接访问本地CurrentUser证书存储中的证书。本地证书仅适用于SSIS这类本地运行工具,ADF必须使用托管密钥管理服务(如Azure Key Vault,AKV)来访问Always Encrypted密钥。
解决方向
直接放弃本地证书方案,改用AKV托管列主密钥(CMK),并确保ADF能通过合法权限访问AKV。
错误2200:解密列失败+AKV Provider资源缺失
该错误由两个问题叠加导致,需分别处理:
1. Microsoft.SqlServer.Management.AlwaysEncrypted.AzureKeyVaultProvider资源缺失
原因
若使用自托管集成运行时,默认未预装AKV密钥提供程序组件,导致ADF无法调用AKV完成解密操作。
解决步骤
- 下载与你的SQL Server驱动版本匹配的
Microsoft.SqlServer.Management.AlwaysEncrypted.AzureKeyVaultProviderNuGet包(建议选用最新稳定版)。 - 解压NuGet包,将其中的
Microsoft.SqlServer.Management.AlwaysEncrypted.AzureKeyVaultProvider.dll及依赖DLL复制到自托管IR安装目录下的Shared文件夹(默认路径:C:\Program Files\Microsoft Integration Runtime\5.0\Shared\)。 - 重启自托管IR服务,确保组件加载生效。
2. 解密Firstname列失败
核心检查点
- AKV权限配置:给ADF使用的身份(托管标识/服务主体)分配AKV的以下权限:
- 密钥权限:
Get、Wrap Key、Unwrap Key(解密必须依赖这些操作) - 确保权限范围覆盖目标列主密钥(CMK)
- 密钥权限:
- Linked Service配置验证:
- 在SQL Server Linked Service的
Always Encrypted设置中,选择Azure Key Vault作为密钥存储类型。 - 确认连接字符串已添加
Column Encryption Setting=Enabled参数(启用Always Encrypted解密逻辑)。 - 验证AKV的认证方式(托管标识/服务主体)可正常访问AKV(通过测试连接确认)。
- 在SQL Server Linked Service的
- 第三方SQL Server密钥关联:
- 确认第三方SQL Server中的**列加密密钥(CEK)是由AKV中的列主密钥(CMK)**加密的。若原CMK为本地证书,需第三方协助将CMK迁移至AKV(因他们管控数据库)。
额外验证步骤
- 测试自托管IR能否同时访问第三方SQL Server和AKV(排查网络连通性、防火墙规则)。
- 使用拥有AKV权限的身份,手动运行带
Column Encryption Setting=Enabled参数的SQL查询,验证解密是否正常,排除密钥本身的问题。
内容的提问来源于stack exchange,提问作者Gav Cheal
相关产品推荐
相关产品推荐

