亚马逊AWS官方博客

导入区块链私钥到 AWS CMK

一、概述

在数字资产的世界里,私钥一直是最至为重要的东西,“假如你不能拥有你的私钥,你就不能拥有数字资产”,由此可见,妥善保存私钥的重要性!与传统资产不同,数字资产由“私钥”(一串字母和数字)控制,就像密码一样,解锁了管理和使用资产的权利。拥有私钥所赋予的权力使得它们保持私密性至关重要。所有者永远不应与其他任何人共享它们,因为它们可用于将资金不可逆转地从钱包中转出。随着区块链在全球大规模的使用,无论是个人还是相关从业者都在对手上拥有的密钥进行加密和存储,而且在我们在签名和验证的过程中,都需要通过私钥进行处理,这样就更大程度上造成了私钥被泄漏的风险。

所以,在 AWS 上的客户,也在寻求更好的解决方案来保护自己和客户的私钥,而且还能更大程度上的降低运营成本。在 2023 年 06 月 05 日,AWS KMS 的产品 Feature 指出,可以通过 KMS 支持对非对称算法的私钥的导入,详情请见:https://aws.amazon.com/about-aws/whats-new/2023/06/aws-kms-importing-asymmetric-hmac-keys/

二、方案概述

本方案构建一个基于在 2022 年 02 月 10 日的一个 Blog 进行功能扩展,我们可以提前设置和安装此 Blog,方便测试和验证,可以参考此链接 EIP1559 Sign transaction。下图展示了钱包应用的部署架构,使用了包括 AWS Mangement Console,AWS KMS/CMK,Amazon Lambda,AWS KMS,AWS AMB 等服务。

此方案主要的原理是:

1. 通过 CloudFormation 构建一个 AWS KMS 托管的 CMK,此 CMK 无法下载私钥,整个的生命周期都是 AWS KMS 负责管理,我们可以根据 IAM 对这个 Key 进行权限的设置,保证其在使用过程中的安全性。

2. CloudFormation 接下来会创建两个 Lambda 程序,一个是基于 EIP 1559 协议的签名和验证,另一个是传统的方式直接对 Transcation 进行签名,如下:

3. 我们可以点击 EIP1559 这个 Function 进行设置:

ETH_NETWORK 指定 Blockchain 的类型

KMS_KEY_ID  自动创建的非对称的 CMK 的 ID

LOG_LEVEL 输出日志的级别

接下来我们分两种方式来构建这个 CMK。

默认托管方式

此方式创建出来的 CMK,完全由 AWS 负责管理,我们没有办法将其导出。

1. 首先我们进入 AWS 的 Web Console,当然我们也可以使用 AWS CLI 进行创建,此文为方便理解使用 Web UI 创建。

2. 其次,我们选择 Key 的类型为非对称加密,然后选择 Key 的使用是为了签名和验证,再选择 Key 的加密算法 ECC_SECG_P256K1,最后选择下一步。

3. 创建 Key 的 Alias 别名,内容可以随意填写,方便找到。

4. 选择此 Key 的管理员。

5. 选择此 Key 的使用人员,管理 Key 和使用 Key 的人员分离,保证 Key 的安全性。

6. 最后 review 一下创建的过程,点击创建。

此时这个 AWS CMK 生成的 Key 创建成功。

用户提供私钥导入 CMK 的方式

此方式创建出来的 CMK,用户不可以下载,但是用户已经拥有了 Private Key, 只要好好保存,在任意时刻都可以再次导入。

1. 同1

2. 我们选择 Key 的类型为非对称加密,然后选择 Key 的使用是为了签名和验证,再选择 Key 的加密算法 ECC_SECG_P256K1,需要选择高级选项,设置外部导入 Key的材料,并勾选协议,最后选择下一步。

3. 同 3,只是修改一下 key 的别名方便查找。

4、5、6 同上。

7. 此时我们需要选择上传 Key 材料的步骤了,接下来我们通过命令的方式生成和上传我们的私钥。拷贝这个Key ID,我们后面会用到:9bd5ca27-9b87-4c95-a60d-6f9f0885d464。


此时这个 Key 正在等待我们的上传。

8. 生成和上传步骤,这时我们最好创建一个 EC2 的实例,或者直接通过 Cloud Shell 进行操作:

如果没有 openssl 请用 sudo yum install openssl -y 安装。

# 生成 Private key 
openssl ecparam -name secp256k1 -genkey -noout -out ec-secp256k1-priv-key.pem
# 设置变量将上面创建的 wrap key 的 PublicKey 和 ImportToken 下载下来,方便我们生成满足要求的 Key 材料
export KEY=`aws kms get-parameters-for-import --region ap-southeast-1 \
 --key-id 9bd5ca27-9b87-4c95-a60d-6f9f0885d464 \
 --wrapping-algorithm RSAES_OAEP_SHA_256 \
 --wrapping-key-spec RSA_2048 \
 --query '{Key:PublicKey,Token:ImportToken}' \
 --output text`
echo $KEY | awk '{print $1}' > PublicKey.b64
echo $KEY | awk '{print $2}' > ImportToken.b64
openssl enc -d -base64 -A -in PublicKey.b64 -out PublicKey.bin
openssl enc -d -base64 -A -in ImportToken.b64 -out ImportToken.bin

# 把私钥通过 base64 转换后,并且生成二进制文件,我们可以直接通过命令一次性完成

cat ec-secp256k1-priv-key.pem | openssl pkcs8 -topk8 -outform der \
-nocrypt > ec-secp256k1-priv-key.der

# 接下来我们用 pkeyutl 将生成的二进制文件加密,并生成符合要求的 Key 材料

openssl pkeyutl \
-encrypt \
-in ec-secp256k1-priv-key.der \
-out EncryptedKeyMaterial.bin \
-inkey PublicKey.bin \
-keyform DER \
-pubin -encrypt -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256

# 接下来我们执行上传操作
 
aws kms import-key-material --region ap-southeast-1 \
 --key-id 9bd5ca27-9b87-4c95-a60d-6f9f0885d464 \
 --encrypted-key-material fileb://EncryptedKeyMaterial.bin \
 --import-token fileb://ImportToken.bin \
 --expiration-model KEY_MATERIAL_DOES_NOT_EXPIRE

此时我们可以看到,此 Key 已经成功导入。

三、测试

1. 测试生成的 Private Key 和 MetaMark 对比

根据生成的 Pem 文件,通过文本形式转存

cat ec-secp256k1-priv-key.pem | openssl ec -text -noout > key

萃取公钥地址

cat key | grep pub -A 5 | tail -n +2 | tr -d ‘\n[:space:]:’ | sed ‘s/^04//’ > pub

萃取私钥地址,去除开头的 00

cat key | grep priv -A 3 | tail -n +2 | tr -d ‘\n[:space:]:’ | sed ‘s/^00//’ > priv

把私钥地址导入到 MetaMask 私钥

fe6e0d3eee9b441d48e8791146978e1d884da7ba6ea16b2ed92f2860b80cb7f1



对应的地址  0xC91BE85c51b79eBf6C038feaA579Caa44a6561D0

我们把刚才的 Key 放到最开始创建的 Lambda 环境变量中去做测试:

1. 验证地址是否正确,发现生成的地址和我们预期的一样

2. 再去签名,发现签名功能也正常

环境清理

完成以上部署及功能验证后,为避免持续产生费用,请按照以下步骤停止应用或者删除所有已部署的组件:

# 删除 CloudFormation
# 如果 CloudFormation 没有将 Lambda 删掉,请进入 Lambda 产品中,删除对应的 Lambda 程序
# 删除创建的 KMS CMK

四、总结

本文主要介绍和演示了对 CMK 在 AWS 上使用托管和导入的方式管理重要的密钥信息,一步一步地介绍搭建过程,方便客户用更安全和便捷的方式去维护重要的 Private Key。AWS 还提供了 Cloud HSM 的方式去维护和管理私钥,不仅可以导出基于 Cloud HSM 生成的区块链私钥,而且也可以便捷地导入进去,给客户更灵活的运维能力,因篇幅关系不在此 Blog 中介绍。

本篇作者

孙超群

AWS 解决方案架构师,负责基于 AWS 云计算方案的架构咨询,设计实现并以技术赋能助力企业成长,同时热衷于为客户设计和构建端到端的区块链解决方案。