You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确保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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 16:12:42