Azure密钥保管库PGP公钥在.NET应用中加密报错排查
解决Azure密钥保管库PGP公钥在.NET调用时的加密密钥异常问题
问题分析
你遇到的System.ArgumentException: 'passed in key not an encryption key!'异常,核心原因是从Azure密钥保管库获取的公钥流未被PGP库识别为有效加密密钥。但本地文件调用正常,说明公钥本身有效,问题出在从KV读取到流的过程中,大概率是格式损坏、流位置错误或编码问题导致的。
解决方案
1. 重置流的读取位置
从Azure KV获取公钥流后,流指针可能停在末尾,导致PGP库读取不到内容。调用加密方法前必须重置流位置:
publicKeyStream.Seek(0, SeekOrigin.Begin); // 再执行加密调用 Stream pgpEncryptedStream2 = PgpLib.EncryptStream(inputStream, publicKeyStream, publicKeyId, asciiArmor, compress, withIntegrityCheck);
2. 验证公钥格式完整性
把从Azure KV获取的公钥内容导出到本地文件,和能正常使用的本地公钥逐字符对比:
- 检查是否缺失PGP Armor头部(
-----BEGIN PGP PUBLIC KEY BLOCK-----)或尾部(-----END PGP PUBLIC KEY BLOCK-----) - 查看是否存在多余空白字符、换行符差异(比如Windows/Unix换行符不兼容)
- 如果Azure KV存储的是Base64编码后的公钥,需先解码为原始ASCII格式再转流:
string base64PubKey = await keyVaultClient.GetSecretAsync(vaultUrl, "pgp-pubkey").ConfigureAwait(false); byte[] rawPubKeyBytes = Convert.FromBase64String(base64PubKey); using (var publicKeyStream = new MemoryStream(rawPubKeyBytes)) { publicKeyStream.Seek(0, SeekOrigin.Begin); // 执行加密操作 }
3. 确保编码正确
PGP公钥的ASCII Armor格式需要用UTF-8编码转流,避免使用默认ASCII编码(可能丢失特殊字符):
string pubKeyText = await keyVaultClient.GetSecretAsync(vaultUrl, "pgp-pubkey").ConfigureAwait(false); byte[] pubKeyBytes = Encoding.UTF8.GetBytes(pubKeyText); using (var publicKeyStream = new MemoryStream(pubKeyBytes)) { publicKeyStream.Seek(0, SeekOrigin.Begin); // 调用加密方法 }
4. 检查密钥ID的正确性
如果PGP公钥的加密权限在子密钥而非主密钥上,需要传入子密钥的KeyId。可以用gpg --list-keys查看密钥的子密钥ID,替换到调用参数中。
验证步骤
- 导出Azure KV中的公钥内容,保存为本地
.asc文件 - 用gpg工具导入并检查权限:
确认输出中包含gpg --import exported_pubkey.asc gpg --list-keys --with-keygripencrypt权限标识 - 用本地导出的文件通过流方式调用加密方法,验证是否能正常运行,排除PGP库本身的问题
内容的提问来源于stack exchange,提问作者Umashankar
相关产品推荐
相关产品推荐

