如何确保TPM 2.0中导入的密钥不可导出?
如何将外部RSA密钥导入TPM 2.0并设置为不可导出
可以实现将导入的RSA密钥设置为不可导出,你之前的操作方向存在错误:一是错误添加了仅适用于TPM原生生成密钥的sensitivedataorigin属性,二是缺少控制密钥不可导出的核心noda属性。以下是正确的操作步骤和关键说明:
关键属性说明
先明确实现不可导出所需的核心属性(错误属性已标注):
noda:核心控制属性,强制TPM禁止导出密钥的敏感数据(私钥部分),直接实现密钥不可提取的目标。fixedtpm:限制密钥仅能在当前TPM中使用,无法迁移到其他TPM设备。fixedparent:限制密钥不能更换父密钥,增强密钥与当前主密钥的绑定性。userwithauth:使用密钥前需验证用户授权(如密码)。decrypt|sign:根据业务需求开启密钥的解密/签名功能。- ❌
sensitivedataorigin:该属性仅针对TPM自身生成的密钥,导入外部密钥时设置会导致属性冲突,是你之前操作失败的原因之一。
正确操作步骤
1. 生成OpenSSL RSA密钥(已有密钥可跳过)
openssl genpkey -algorithm RSA -out private_key.pem
2. 创建TPM主密钥
sudo tpm2_createprimary -C e -g sha256 -G rsa -c primary.ctx
3. 导入外部密钥并设置不可导出属性
这一步是实现目标的核心,需添加正确的属性组合:
sudo tpm2_import -C primary.ctx -G rsa -i private_key.pem -u pub.blob -r priv.blob -a "fixedtpm|fixedparent|noda|userwithauth|decrypt|sign"
4. 加载密钥并设置持久化
# 加载导入的密钥到TPM内存 sudo tpm2_load -C primary.ctx -u pub.blob -r priv.blob -c loaded_key.ctx # 将密钥持久化到TPM非易失性存储(0x81000002为自定义持久化句柄,可按需修改) sudo tpm2_evictcontrol -C o -c loaded_key.ctx 0x81000002
5. 验证密钥属性
执行命令查看持久化密钥的属性,确认包含noda:
sudo tpm2_readpublic -c 0x81000002
输出的属性列表中应包含noda|fixedtpm|fixedparent|userwithauth|decrypt|sign,此时密钥已无法被导出或提取私钥,仅能在TPM内部执行加密、解密或签名操作。
额外注意事项
- 一旦设置
noda属性,密钥的敏感数据将永久无法从TPM中导出,操作前请确认无需再导出该密钥。 - 持久化句柄(如0x81000002)需避免与已存在的持久化资源冲突,可使用
tpm2_getcap handles-persistent查看已占用的句柄。
内容的提问来源于stack exchange,提问作者Nathol_Laki
相关产品推荐
相关产品推荐

