我想使用 OpenSSL 通过 AWS Key Management Service (AWS KMS) 密钥来加密文件。
解决方法
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
创建 RSA 密钥对,下载公有密钥并创建 AES 256 位密钥
完成以下步骤:
- 创建 RSA 密钥对。
- 要下载公有密钥,请运行 AWS CLI 命令 get-public-key:
aws kms get-public-key --key-id your-key-id --output text --query 'PublicKey' > RSAPublic.b64 && base64 -d RSAPublic.b64 > RSAPublic.bin
注意:将 your-key-id 替换您的非对称密钥 ID。--query 函数可获取公有密钥,然后将 base64 文件解码为 DER 密钥。
- 运行以下 OpenSSL rand 命令来创建高级加密标准 (AES) 256 位密钥:
openssl rand -base64 32 > key.bin
加密您的数据
完成以下步骤:
- 使用 key.bin 文件运行以下 OpenSSL enc 命令:
openssl enc -aes-256-cbc -salt -pbkdf2 -in FILE_TO_ENCRYPT -out FILE_TO_ENCRYPT.enc -pass file:./key.bin
注意:将 FILE_TO_ENCRYPT 替换为您的文件名。-pbkdf2 命令仅适用于 OpenSSL 1.1.1。Amazon Linux 2 亚马逊机器映像 (AMI) 使用 OpenSSL 1.0.2,不支持 -pbkdf2 命令。
- 使用 AWS KMS 公有密钥加密 key.bin 文件。这样可以保护您的密钥数据。只有有权访问您的 AWS KMS 私有密钥的用户才能访问 key.bin 文件。为此,请运行 OpenSSL pkeyutl 命令:
openssl pkeyutl -in key.bin -out enc.key.bin -inkey RSAPublic.bin -keyform DER -pubin -encrypt -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256
**注意:**pkeyutl 命令使用的加密算法支持 AWS KMS API RSAES_OAEP_SHA_256 进行解密。AWS KMS 公有密钥 RSAPublic.bin 对 AES 256 位密钥进行加密,并创建一个名为 enc.key.bin 的新文件。
- 为了加密 key.bin 文件,使得用户必须解密 enc.key.bin 文件才能访问 key.bin,请运行 rm AWS CLI 命令:
aws s3 rm key.bin && rm FILE_TO_ENCRYPT
**注意:**将 FILE_TO_ENCRYPT 替换为您的文件名。
- (可选)删除要加密的原始文件,这样用户就无法访问该文件。
您现在拥有以下资源:
- FILE_TO_ENCRYPT.enc 文件中的加密数据。
- 加密的 AES 256 位密钥 enc.key.bin。
- AWS KMS 公有密钥 RSAPublic.bin。
**注意:**拥有加密数据的用户必须将文件发送给您进行解密。
解密您的文件
要检索加密数据,请解密 enc.key.bin,然后使用该密钥解密文件 FILE_TO_ENCRYPT.enc。
**注意:**您必须有权访问 AWS KMS API,因为 AWS KMS 私有密钥无法以明文形式查看。
完成以下步骤:
- 要解密 enc.key.bin 文件并将其发送到 AWS KMS API,请运行 decrypt AWS CLI 命令:
aws kms decrypt --key-id your-key-id --ciphertext-blob fileb://enc.key.bin --encryption-algorithm RSAES_OAEP_SHA_256 --output text --query 'Plaintext' | base64 --decode > decryptedKey.bin
注意:将 your-key-id 替换为您的密钥 ID。--query 函数可提取明文,然后将 base64 值解码到 decryptedKey.bin 文件。
- 要输出解密后的文件,请在运行以下 OpenSSL enc 命令时使用 decryptedKey.bin 文件:
openssl enc -d -aes-256-cbc -pbkdf2 -in FILE_TO_ENCRYPT.enc -out DECRYPTED_FILE -pass file:./decryptedKey.bin
**注意:**将 DECRYPTED_FILE 替换为您的文件名。
- 要验证加密和解密是否成功完成,请将 DECRYPTED_FILE 和 FILE_TO_ENCRYPT 进行比较。