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

Rails中使用PGP解密文件出现No secret key错误的求助

问题分析与解决方案

文件后缀不影响PGP解密逻辑,你遇到的No secret key错误核心是GPGME无法找到用于解密的有效私钥,和文件后缀无关。以下是具体排查和解决步骤:

1. 验证私钥是否成功导入

导入私钥后,务必确认私钥已被正确加载到GPGME的密钥环中。可以在控制台执行以下代码检查:

# 列出所有已加载的私钥
GPGME::Key.find(:secret).each do |key|
  puts "私钥指纹: #{key.subkeys.first.fpr}"
  puts "私钥用户ID: #{key.uids.first.name} <#{key.uids.first.email}>"
end

将输出的指纹与你私钥文件的指纹对比(可通过gpg --show-keys private_key.pgp在命令行查看),确认私钥确实已导入。

2. 处理带密码保护的私钥

如果你的私钥设置了密码,解密时必须提供密码回调,否则GPGME无法解锁私钥。修改解密代码:

crypto = GPGME::Crypto.new(passphrase_callback: ->(hints, ok) { "你的私钥密码" })
import_result = GPGME::Key.import(File.open('private_key.pgp'))
# 确认导入成功
raise "私钥导入失败" if import_result.imported == 0

ciphertext = GPGME::Data.new(File.open('encrypted_file.xlsx'))
data = crypto.decrypt(ciphertext)

3. 检查私钥文件格式

确保私钥文件是标准的ASCII armored格式(文件开头为-----BEGIN PGP PRIVATE KEY BLOCK-----,结尾为-----END PGP PRIVATE KEY BLOCK-----)。如果是二进制格式,先通过命令行测试导入:

gpg --import private_key.pgp

若命令行导入失败,说明私钥文件本身存在问题(如损坏、格式错误),需要重新获取正确的私钥文件。

4. 优化私钥导入的错误处理

导入私钥时捕获导入结果,避免静默失败:

import_result = GPGME::Key.import(File.open('private_key.pgp'))
if import_result.imported == 0
  puts "私钥未导入,可能原因:文件格式错误、私钥已存在"
  puts "导入详情: #{import_result.summary}"
end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:08:20