You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,替换到调用参数中。

验证步骤

  1. 导出Azure KV中的公钥内容,保存为本地.asc文件
  2. 用gpg工具导入并检查权限:
    gpg --import exported_pubkey.asc
    gpg --list-keys --with-keygrip
    
    确认输出中包含encrypt权限标识
  3. 用本地导出的文件通过流方式调用加密方法,验证是否能正常运行,排除PGP库本身的问题

内容的提问来源于stack exchange,提问作者Umashankar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 09:06:08