AWS Lambda 错误代码 2 中的 GPG 解密
GPG decryption in AWS Lambda error code 2
我正在尝试创建一个 AWS Lambda(在 python 中,尽管我的问题可能与 python 无关),除其他外,它将解密存储在 S3 中的 PGP 文件.
我有一个脚本 运行 在本地(在 ubuntu 机器上)没问题。我已将该脚本的相关部分改编为 lambda 脚本。我正在使用 python-gnupg,并创建了一个层来实现该功能。
我在那台 ubuntu 机器上创建了一个 CentOS VM,并在上面安装了 gpg。
我有一个我认为正确的部署 zip(内容是脚本,bin/gpg,lib/{libgpg-error.so.0,libreadline.so.7,libcrypt.so.20,libassuan.so.0};gpg 可执行文件和库都来自该 CentOS VM)。例如,如果我从中删除 libassuan,我确实会收到有关缺少依赖项的错误,因此我相信 zip 已正确创建。
当我部署 lambda 时,代码显示正确并且似乎 运行(当然,我必须将其设置为使用 python-gnupg 层)。
这仍处于基本测试阶段,因此我尝试解密的文件与我在 ubuntu 盒测试中使用的文件相同,并且正在从 S3 中检索。正在从 AWS Parameter Store 检索解密密钥和密码短语,据我所知,它们被正确检索(后者绝对正确;前者是正确的长度,具有正确的开始和正确的结束)。而且我在添加密钥时没有收到错误消息(我不确定我是否会这样做)。
所以,一切看起来都很好,进来了。进入解密本身,我们有:
gpg = gnupg.GPG(gnupghome=f"{targetDir}/..", gpgbinary="./bin/gpg")
key_data = open(keyFileName, 'rb').read()
priv_key = gpg.import_keys(key_data)
decrData = gpg.decrypt_file(contents, passphrase=pgpPassphrase, always_trust=True, extra_args=[ '--yes' ])
if not decrData.ok:
logger.error (f"decryption failed: {decrData.status}")
正如我之前暗示的那样,这失败了,错误代码为 2,打印的状态消息是 'decryption failed'。完全没用。
不出所料,decrData 对象的数据为零。
FWIW,always_true 和 extra_args,如图所示,没有改变任何东西(也没有通过 extra_args=[ '--yes', '--always-相信' ])。在添加这些之前我得到了完全相同的结果。
综上所述,问题是,有没有人对我可能做错的事情有任何建议,或者我还可以检查什么以了解为什么会出现此错误?
谢谢。
更新:
好的,我在这里犯了一个错误。我在本地没有这个工作;我有一个不同的版本(使用 PGPy)在本地工作。
昨天在本地测试,发现我的问题是密钥没有导入成功。其根源似乎是密钥格式错误(二进制,在 Parameter Store 中以 uuencoded 发送)。所以我重新导出了密钥,将参数 '--armor' 添加到 'gpg --export-secret-keys' 命令,然后将 'passphrase=...' 添加到 gpg.import_keys() 调用,并且在本地工作(至少导入密钥;我实际上没有检查 gpg.decrypt() 或 gpg.decrypt_file() 命令。
然而,获取导出的密钥并将其放入参数存储...看起来我从参数存储中正确取回它(我已经检查了开头、结尾和中间的点- 包括我从参数存储中加入两个参数的地方),但是当我 运行 我的 lambda 时,密钥仍然没有正确导入。 FWIW,我确实尝试将“extra_args=['--yes','--always-trust']”添加到 gpg.import_keys(),但什么也没做。我还尝试将密钥文件上传到 S3,然后从那里取回,但同样没有任何效果。
再次,我欢迎任何关于尝试其他事情的建议。
再次感谢。
更新 2:我还尝试提供密钥文件(ascii-armored)作为分发 zip 的一部分。那种工作(尽管我确实必须将密钥文件放入子目录;将其留在顶层会导致主 python 文件出现权限问题,不知何故),因为文件在那里,并且似乎被正确阅读了。但是,key还是导入失败。
我似乎被困在使用 PGPy 解决方案的地方,代码在本地 运行 时完美运行,但在 AWS 中 运行 时却没有。
更新 3:终于完成了 运行 我的本地测试,正如预期的那样,文件完美解密。希望我知道为什么我不能在 AWS 上导入密钥。
这里有几件事要补充。
我对本地测试感到困惑的部分原因是我是在 Python 3.7 运行时(GPG 作为 VM 的一部分)下获得它 运行。所以这是部分答案。
不过,我试图让它 运行 低于 3.9,以保持最新。我试图通过 Docker 图片解决这个问题。我创建了图像,但由于可怕的原因无法部署它。所以这就是我尝试通过部署 zip 的原因。
正如我所提到的,我使用的是从 CentOS VM 中提取的 GPG 版本(和相关库)。这确实比我之前的尝试更接近,我之前使用 Ubuntu 中的 GPG/libraries。这在 libc 版本上已经崩溃了。
不过,今天我终于想到,也许我可以拆开我的 Docker 图像,然后从中获取 GPG/libraries。使用 'docker save --output="filename.tar" image-name',我能够将文件转储出来,因此我筛选了它以获取相关文件并创建了一个新的部署 zip。
缺点是效果很好。
我正在尝试创建一个 AWS Lambda(在 python 中,尽管我的问题可能与 python 无关),除其他外,它将解密存储在 S3 中的 PGP 文件.
我有一个脚本 运行 在本地(在 ubuntu 机器上)没问题。我已将该脚本的相关部分改编为 lambda 脚本。我正在使用 python-gnupg,并创建了一个层来实现该功能。
我在那台 ubuntu 机器上创建了一个 CentOS VM,并在上面安装了 gpg。
我有一个我认为正确的部署 zip(内容是脚本,bin/gpg,lib/{libgpg-error.so.0,libreadline.so.7,libcrypt.so.20,libassuan.so.0};gpg 可执行文件和库都来自该 CentOS VM)。例如,如果我从中删除 libassuan,我确实会收到有关缺少依赖项的错误,因此我相信 zip 已正确创建。
当我部署 lambda 时,代码显示正确并且似乎 运行(当然,我必须将其设置为使用 python-gnupg 层)。
这仍处于基本测试阶段,因此我尝试解密的文件与我在 ubuntu 盒测试中使用的文件相同,并且正在从 S3 中检索。正在从 AWS Parameter Store 检索解密密钥和密码短语,据我所知,它们被正确检索(后者绝对正确;前者是正确的长度,具有正确的开始和正确的结束)。而且我在添加密钥时没有收到错误消息(我不确定我是否会这样做)。
所以,一切看起来都很好,进来了。进入解密本身,我们有:
gpg = gnupg.GPG(gnupghome=f"{targetDir}/..", gpgbinary="./bin/gpg")
key_data = open(keyFileName, 'rb').read()
priv_key = gpg.import_keys(key_data)
decrData = gpg.decrypt_file(contents, passphrase=pgpPassphrase, always_trust=True, extra_args=[ '--yes' ])
if not decrData.ok:
logger.error (f"decryption failed: {decrData.status}")
正如我之前暗示的那样,这失败了,错误代码为 2,打印的状态消息是 'decryption failed'。完全没用。
不出所料,decrData 对象的数据为零。
FWIW,always_true 和 extra_args,如图所示,没有改变任何东西(也没有通过 extra_args=[ '--yes', '--always-相信' ])。在添加这些之前我得到了完全相同的结果。
综上所述,问题是,有没有人对我可能做错的事情有任何建议,或者我还可以检查什么以了解为什么会出现此错误?
谢谢。
更新: 好的,我在这里犯了一个错误。我在本地没有这个工作;我有一个不同的版本(使用 PGPy)在本地工作。
昨天在本地测试,发现我的问题是密钥没有导入成功。其根源似乎是密钥格式错误(二进制,在 Parameter Store 中以 uuencoded 发送)。所以我重新导出了密钥,将参数 '--armor' 添加到 'gpg --export-secret-keys' 命令,然后将 'passphrase=...' 添加到 gpg.import_keys() 调用,并且在本地工作(至少导入密钥;我实际上没有检查 gpg.decrypt() 或 gpg.decrypt_file() 命令。
然而,获取导出的密钥并将其放入参数存储...看起来我从参数存储中正确取回它(我已经检查了开头、结尾和中间的点- 包括我从参数存储中加入两个参数的地方),但是当我 运行 我的 lambda 时,密钥仍然没有正确导入。 FWIW,我确实尝试将“extra_args=['--yes','--always-trust']”添加到 gpg.import_keys(),但什么也没做。我还尝试将密钥文件上传到 S3,然后从那里取回,但同样没有任何效果。
再次,我欢迎任何关于尝试其他事情的建议。
再次感谢。
更新 2:我还尝试提供密钥文件(ascii-armored)作为分发 zip 的一部分。那种工作(尽管我确实必须将密钥文件放入子目录;将其留在顶层会导致主 python 文件出现权限问题,不知何故),因为文件在那里,并且似乎被正确阅读了。但是,key还是导入失败。
我似乎被困在使用 PGPy 解决方案的地方,代码在本地 运行 时完美运行,但在 AWS 中 运行 时却没有。
更新 3:终于完成了 运行 我的本地测试,正如预期的那样,文件完美解密。希望我知道为什么我不能在 AWS 上导入密钥。
这里有几件事要补充。
我对本地测试感到困惑的部分原因是我是在 Python 3.7 运行时(GPG 作为 VM 的一部分)下获得它 运行。所以这是部分答案。
不过,我试图让它 运行 低于 3.9,以保持最新。我试图通过 Docker 图片解决这个问题。我创建了图像,但由于可怕的原因无法部署它。所以这就是我尝试通过部署 zip 的原因。
正如我所提到的,我使用的是从 CentOS VM 中提取的 GPG 版本(和相关库)。这确实比我之前的尝试更接近,我之前使用 Ubuntu 中的 GPG/libraries。这在 libc 版本上已经崩溃了。
不过,今天我终于想到,也许我可以拆开我的 Docker 图像,然后从中获取 GPG/libraries。使用 'docker save --output="filename.tar" image-name',我能够将文件转储出来,因此我筛选了它以获取相关文件并创建了一个新的部署 zip。
缺点是效果很好。