使用 GPG 卡上的 ssh 密钥解密数据

使用 GPG 卡上的 ssh 密钥解密数据

在 AWS 中创建 Windows 实例时,其密码使用 SSH 密钥的公共部分加密。

然后可以使用以下命令来检索加密密码:

 aws ec2 get-password-data --instance-id=i-0a5102eb55ed6e0b9

(看https://docs.aws.amazon.com/cli/latest/reference/ec2/get-password-data.html#examples

该命令返回以下数据:

{
    "InstanceId": "i-0a5102eb55ed6e0b9",
    "Timestamp": "2019-11-04T12:21:30.000Z",
    "PasswordData": "\r\nbase64_data==\r\n"
}

加密的密码数据是 base64 编码的,但如果您拥有 SSH 密钥的私有部分,则可以解密“PasswordData”字段:

echo "base64_data" | base64 --decode | openssl rsautl -decrypt -inkey "./path_to_private_ssh_key"

(查看 Github repo 示例https://github.com/tomrittervg/decrypt-windows-ec2-passwd/blob/master/decrypt-windows-ec2-passwd.sh

这很好用,但是,我使用 Nitrokey Professional 来存储我的私钥,我找不到任何方法告诉 openssl 命令使用 GPG 卡来解密数据。如果可能的话,我想将私钥从我的磁盘中移除。

作为参考,为了将公钥放入 AWS,我使用命令以正确的 SSH 格式导出 AWS 的公钥。gpg --export-ssh-key [email protected]

有没有办法使用该卡解密数据?

答案1

在 Linux 上,我还没有找到基于 GPG 的等效方法,但你可以使用 PKCS#11 接口来实现这一点。我有一个类似的设置,使用 Yubikey 和记录过程,但 tl;dr 是:

  1. 将密钥加载到密钥的 PKCS#11 区域。在 Yubikey 中,这是 PIV,对于 Nitrokey,您需要确保拥有支持 PKCS#11 的硬件。在 Yubikey 上,您无法使用设备上的密钥生成,因此您需要使用隔离的机器来生成密钥,然后根据需要加载密钥。
  2. 使用 pkcs11-tool 执行解密。在 Linux 上,我通常必须移除/重新插入我的设备,否则 pkcs11-tool 会在我使用一次后失去 gpg-agent 对我的卡的锁定。

解密的相关命令如下:

aws ec2 get-password-data --instance-id <blah> --query PasswordData --output text| base64 -d > encrypted-adminpass.bin
pkcs11-tool --decrypt -v -l --input-file encrypted-adminpass.bin -m RSA-PKCS

相关内容