Cosmos DB调用RewrapClientEncryptionKeyAsync返回400 Bad Request
报错根因
- 核心问题为
Microsoft.Azure.Cosmos.Encryption 1.0.0正式版存在请求构造Bug:调用RewrapClientEncryptionKeyAsync执行CMK轮换时,该版本SDK错误将Azure Key Vault要求使用POST方法的密钥重封装操作,构造为GET请求发起,直接触发Key Vault返回400 BadParameter,错误信息为GET method does not allow the operation。 - 依赖版本不匹配加剧问题:当前使用的
Azure.Security.KeyVault.Keys 4.3.0、Azure.Identity 1.6.0与1.0.0版Cosmos加密包存在请求路由逻辑兼容问题,旧版加密包未适配新版Key Vault SDK的请求方法校验规则。 - 可排除的排查方向:现有旧密钥可正常完成数据创建、读取操作,说明DefaultAzureCredential认证逻辑、新旧密钥的wrap/unwrap/rotate权限配置、Cosmos客户端与数据库运行状态均无问题,不需要调整权限或网络配置。
修复步骤
- 升级NuGet包到兼容固定版本
卸载现有问题版本包,安装以下经兼容性验证的版本组合,不要随意跨大版本升级:Microsoft.Azure.Cosmos.Encryption:升级至1.0.0-preview33及以上预览版
注意:1.0.0正式版为存在该Bug的版本,2.x系列加密包存在API破坏性变更,与现有文档指引代码不兼容,请勿升级。
Microsoft.Azure.Cosmos:同步升级至3.31.2及以上版本,与加密包版本匹配Azure.Security.KeyVault.Keys:升级至4.4.0及以上版本Azure.Identity:升级至1.8.0及以上版本
- 调整轮换代码显式传入密钥提供程序
不要依赖全局注册的默认密钥提供程序自动匹配新旧CMK,调用方法时显式传入新密钥对应的Key Vault客户端实例,参考代码如下:// 初始化新CMK对应的Key Vault密钥客户端 var newKvClient = new KeyClient( vaultUri: new Uri("你的Key Vault服务地址"), credential: new DefaultAzureCredential()); var newKeyProvider = new AzureKeyVaultKeyEncryptionKeyClient(newKvClient); // 执行客户端加密密钥重封装 var database = cosmosClient.GetDatabase("你的数据库名称"); await database.RewrapClientEncryptionKeyAsync( keyEncryptionKeyName: "你已创建的客户端加密密钥名称", newKeyEncryptionKeyResolver: newKeyProvider, cancellationToken: CancellationToken.None); - 结果验证
调整完成后重新执行轮换操作,将正常返回200状态码。重封装完成后,所有存量加密数据不需要手动迁移,即可通过新CMK完成加解密操作。
内容的提问来源于stack exchange,提问作者Lan
相关产品推荐
相关产品推荐

