本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程: Amazon IoT Greengrass 使用可信平台模块 (TPM) 进行安全保护
注意
仅支持本教程中的机制使用手动资源配置来安装 Amazon IoT Greengrass Core 软件。
本教程包含有关如何使用该 TPM2 芯片作为硬件安全模块 (HSM) 来创建私钥和 CSR 的说明。这是习惯的创建事物证书。
本教程向您展示如何使用 PKCS #11 接口为 Amazon IoT Greengrass 核心软件配置可信平台模块 (TPM),从而增强设备安全性。这种 TPM 集成可确保用于设备识别和连接的私钥和证书安全地存储在防篡改的硬件中,防止因冒充或其他恶意活动而 Amazon IoT Core 被提取。
完成此集成后,您的 Greengrass 核心设备将使用受 TPM 保护的私钥进行身份识别和与服务的通信。 Amazon IoT
有关 Greengrass 设备安全的更多信息,请参阅。安全性 Amazon IoT Greengrass
先决条件
要完成本教程,您需要:
- 
        
一款兼容 Linux 的设备,配备 TPM 2.0 硬件或固件 TPM 2.0。
 - 
        
本教程中的说明是针对 Ubuntu 24.04 LTS 定义的。
- 
            
任何支持 Linux TPM2 软件堆栈的 Linux
发行版都可以支持这种机制。  
 - 
            
 - 
        
一台开发者计算机, Amazon CLI 安装并配置了以下权限:
- 
            
创建和管理 Amazon IoT 资源
 - 
            
创建和管理 IAM 角色和策略
 
 - 
            
 - 
        
您的设备上安装了 Java 运行时环境 (JRE) 版本 8 或更高版本。
 - 
        
您的设备上安装了以下软件包:
- 
            
curl
 - 
            
jg
 
 - 
            
 - 
        
设备上的 root 或 sudo 权限。
 
步骤 1:安装 TPM2 工具和依赖项
在此步骤中,您将安装必要的 TPM2 软件工具和库。
- 
        
通过运行以下命令更新您的软件包管理器并安装 TPM2 工具和依赖项。
sudo apt-get update && sudo apt-get install tpm2-tools \ tpm2-abrmd \ tpm2-tss-engine-tools \ gnutls-bin \ libtpm2-pkcs11-1 \ libtpm2-pkcs11-tools \ libtpm2-pkcs11-1-dev \ python3-tpm2-pkcs11-tools \ libengine-pkcs11-openssl \ libtss2-tcti-tabrmd0 - 
        
在 Ubuntu 24.04 上安装使用 OpenSSL 引擎 3 的 OpenSSL TPM2 提供程序包。
sudo apt-get install tpm2-openssl 
第 2 步:初始化 PKCS #11 存储并创建插槽
- 
        
创建用于存储数据的目录。
sudo mkdir -p /etc/tpm2_pkcs11 - 
        
将存储位置设置为环境变量。有关商店层次结构的更多信息,请参阅初始化
。 export TPM2_PKCS11_STORE=/etc/tpm2_store - 
        
用主对象初始化 TPM2 令牌。
sudo tpm2_ptool init可用的选项如下:
hierarchy-auth HIERARCHY_AUTH- 
              
用于向层次结构中添加主对象的授权密码。
 primary-auth PRIMARY_AUTH- 
              
现有主键对象的授权值。
默认值为空的身份验证值。
 primary-handle [PRIMARY_HANDLE]- 
              
使用现有的主键对象。
默认值:
0x81000001 transient-parents- 
              
使用给定模板的瞬态主对象。
值:
tpm2-tools-default、tpm2-tools-ecc-default、tss2-engine-key path PATH- 
              
商店目录的位置。如果指定,则该目录必须存在。如果未指定,则通过查看环境变量来执行搜索
TPM2_PKCS11_STORE。如果未设置该环境变量,它将查看/etc/tpm2_pkcs11。如果找不到或无法创建该目录,则默认为当前工作目录。 
 
步骤 3:创建令牌和密钥
- 
        
创建 PKCS #11 代币。
sudo tpm2_ptool addtoken —pid=1 —userpin=USERPIN—sopin=SOPIN—label=greengrass可用选项如下:
--pid PID- 
              
要与此令牌关联的主要对象 ID。
 --sopin SOPIN- 
              
管理员 PIN。此引脚用于对象恢复。
 --userpin USERPIN- 
              
用户 PIN。此 PIN 用于对对象使用进行身份验证。
 --label LABEL- 
              
用于识别正在使用的配置文件的唯一标签必须是唯一的。
 --hierarchy-auth HIERARCHY_AUTH
 - 
        
创建 ECC 密钥对象。
sudo tpm2_ptool addkey —algorithm=ecc256 —label=greengrass —userpin=****** —key-label=greenkey--label LABEL- 
              
令牌标签也用于导入密钥。
 --key-label KEY_LABEL- 
              
导入的密钥的标签。默认为整数值。
 --id ID- 
              
密钥 ID。默认为随机 8 字节的十六进制。
 --attr-always-authenticate- 
              
将 CKA_ALWAYS_AUTHENTICATHENTICATE 属性设置为 C
 --hierarchy-auth HIERARCHY_AUTH- 
              
层次验证,是瞬态对象所必需的。
 --sopin SOPIN- 
              
管理员 PIN。
 --userpin USERPIN- 
              
用户 PIN。
 --algorithm- 
              
{rsa1024、rsa2048、rsa3072、rsa4096、aes128、aes256、ecc224、ecc256、ecc384、ecc521、hmac: sha1、hmac: sha256、hmac: sha384、hmac: sha512}
密钥的类型。
 
 - 
        
从令牌中导出 TPM2-TSS 对象以捕获身份验证数据。
yaml_ecc0=$(sudo tpm2_ptool export —label="greengrass" —key-label="greenkey" —userpin="******")输出示例:
> echo $yaml_ecc0 object-auth: 706c1cad8a5238871b30149705255926 primary-object: auth: '' hierarchy: owner is_transient: false注意
您还可以在运行此命令的目录中找到一个名为 “greenkey.pem” 的文件,它是 TSS2 私钥。使用它通过 tpm2 openssl 提供程序生成 CSR。 TSS2 私钥文件受到 TPM 保护,不能在其他计算机上使用。有关使用 OpenSSL 的 TSS2 密钥的更多信息,请参阅存储私钥或公
钥。  - 
        
捕获 TSS 私钥的身份验证数据。
auth_ecc0=$(echo "$yaml_ecc0" | grep "object-auth" | cut -d' ' -f2-) 
步骤 4:生成证书签名请求 (CSR)
在此步骤中,您将使用 TPM2受保护的私钥生成 CSR。
- 
        
使用 TPM2 提供者生成 CSR。
sudo openssl req -new -provider tpm2 -provider base -key greenkey.pem -passin "pass:$auth_ecc0" -out "$H"$HOSTNAME".csr出现提示时,请提供您的 CSR 所需的信息,包括:
- 
            
国家名称(2 个字母的代码)
 - 
            
州或省名称
 - 
            
所在地名称
 - 
            
组织名称
 - 
            
组织部门名称
 - 
            
公用名
 - 
            
电子邮件地址
 
或者,您可以为无人值守生成提供 OpenSSL 配置文件。有关更多信息,请参阅 OpenSSL 文档
。  - 
            
 - 
        
如果您不是在同一台计算机上生成 CSR,请将生成的 CSR 复制到配置了 Amazon 凭据的计算机上。
 
步骤 5:创建事物证书
创建 Amazon IoT 事物证书。有关如何创建事物证书的更多信息,请参阅创建事物证书。
第 6 步:将事物证书导入 TPM
- 
        
将事物证书复制到设备。
 - 
        
将事物证书添加到 Greengrass 令牌中。
sudo tpm2_ptool addcert --label=greengrass --key-label=greenkey device.pem.crt可用选项如下:
--help- 
              
显示此帮助消息并退出。
 --label LABEL- 
              
要删除的配置文件标签。
 --key-label KEY_LABEL- 
              
关联的私钥标签。
 --key-id KEY_ID- 
              
以十六进制表示的关联私钥 ID。
 cert- 
              
要添加的 x509 PEM 证书。
 
 
第 7 步:捕获 PKCS #11 对象网址
我们将使用gnutls-bin软件包中p11tool提供的来获取 PKCS #11 令牌 URL 和对象 URLs。
- 
        
获取 Greengrass 代币的代币网址。
TOKEN=sudo p11tool --list-token-urls | grep "token=greengrass" - 
        
获取 Greengrass 代币的对象 URLs 。使用与步骤 3 中使用的相同 PIN。
sudo p11tool --login --list-all "${TOKEN}"输出示例:
Token 'greengrass' with URL 'pkcs11:model=SLB9672%00%00%00%00%00%00%00%00%00;manufacturer=Infineon;serial=0000000000000000;token=greengrass' requires user PIN Enter PIN: WARNING: Needed CKA_VALUE but didn't find encrypted blob Object 0: URL: pkcs11:model=SLB9672%00%00%00%00%00%00%00%00%00;manufacturer=Infineon;serial=0000000000000000;token=greengrass;id=%39%32%37%65%61%64%61%39%31%32%35%31%61%35%37%31;object=greenkey;type=private Type: Private key (EC/ECDSA-SECP256R1) Label: greenkey Flags: CKA_PRIVATE; CKA_NEVER_EXTRACTABLE; CKA_SENSITIVE; ID: 39:32:37:65:61:64:61:39:31:32:35:31:61:35:37:31 Object 1: URL: pkcs11:model=SLB9672%00%00%00%00%00%00%00%00%00;manufacturer=Infineon;serial=0000000000000000;token=greengrass;id=%39%32%37%65%61%64%61%39%31%32%35%31%61%35%37%31;object=greenkey;type=public Type: Public key (EC/ECDSA-SECP256R1) Label: greenkey ID: 39:32:37:65:61:64:61:39:31:32:35:31:61:35:37:31 Object 2: URL: pkcs11:model=SLB9672%00%00%00%00%00%00%00%00%00;manufacturer=Infineon;serial=0000000000000000;token=greengrass;id=%39%32%37%65%61%64%61%39%31%32%35%31%61%35%37%31;object=greenkey;type=cert Type: X.509 Certificate (EC/ECDSA-SECP256R1) Expires: Fri Dec 31 18:59:59 2049 Label: greenkey ID: 39:32:37:65:61:64:61:39:31:32:35:31:61:35:37:31 - 
        
捕获私钥和证书的对象 URL。
 
第 8 步:配置并安装支持的 Greengrass TPM2
- 
        
配置事物证书。有关更多信息,请参阅配置事物证书。
 - 
        
在 HSM 中完成使用私钥和证书安装 C Amazon IoT Greengrass ore 软件的说明。安装 Amazon IoT Greengrass 核心软件然后,使用以下步骤将您的安装配置为 TPM2 通过 PKCS #11 接口进行利用。
 - 
        
确认您已下载 PKCS #11 提供程序组件并将其保存在您的 Greengrass 安装程序位置。
 - 
        
使用文本编辑器创建名为
config.yaml的配置文件,以提供给安装程序。例如,在基于 Linux 的系统上,你可以运行以下命令来使用 GNUnano来创建文件。nano GreengrassInstaller/config.yaml - 
        
将以下 YAML 内容复制到该文件中。此部分配置文件会指定系统参数、Greengrass Nucleus 参数和 PKCS#11 提供程序参数。
--- system: certificateFilePath: "pkcs11:model=SW%20%20%20TPM%00%00%00%00%00%00%00%00;manufacturer=IBM;serial=0000000000000000;token=greengrass;id=%34%35;object=greenkey;type=cert" privateKeyPath: "pkcs11:model=SW%20%20%20TPM%00%00%00%00%00%00%00%00;manufacturer=IBM;serial=0000000000000000;token=greengrass;id=%34%35;object=greenkey;type=private" rootCaPath: "/greengrass/v2/AmazonRootCA1.pem" rootpath: "/greengrass/v2" thingName: "myThing" services: aws.greengrass.Nucleus: componentType: "NUCLEUS" version: "2.14.0" configuration: awsRegion: "us-east-1" iotRoleAlias: "GreengrassCoreTokenExchangeRoleAlias" iotDataEndpoint: "device-data-prefix-ats.iot.us-west-2.amazonaws.com" iotCredEndpoint: "device-credentials-prefix.credentials.iot.us-west-2.amazonaws.com" aws.greengrass.crypto.Pkcs11Provider: configuration: name: "tpm2_pkcs11" library: "/usr/lib/x86_64-linux-gnu/pkcs11/libtpm2_pkcs11.so" slot: 1 userPin: "123456" - 
        
使用特定于您的安装的参数编辑文件。
- 
            
privateKeyPath 使用更新 certificateFilePath 和步骤 7 中捕获的 PKCS #11 网址进行更新 certificateFilePath。 privateKeyPath
 - 
            
iotCredEndpoint 根据您的 Amazon IoT 终端节点更新您的 iotDataEndpoint 和。
 - 
            
在
aws.greengrass.crypto.Pkcs11Provider配置中,根据您的平台更新库。注意
所示示例适用于 X86_64。 ARM64设备的文件路径将与之类似。
 
 - 
            
 - 
        
完成中的 Greengrass 安装步骤。安装 Amazon IoT Greengrass 核心软件
 
步骤 9:验证安装
在此步骤中,您将通过集成验证 Greengrass 是否正常运行。 TPM2
- 
        
检查 Greengrass 的服务状态。
sudo systemctl status greengrass.service - 
        
查看 Greengrass 日志,确保没有错误。
sudo tail -f /greengrass/v2/logs/greengrass.log - 
        
确认您的设备在Amazon IoT 控制台
中显示为已连接。 - 
            
在 “管理” 下,展开 Greengrass 设备,然后选择核心设备。
 - 
            
确认您的设备已连接。设备状态将显示
HEALTHY是否已连接。有关更多信息,请参阅 检查 Greengrass 核心设备状态。 
 
故障排除
如果您在设置或操作 TPM2启用了 Greengrass 设备的过程中遇到问题,请尝试以下故障排除步骤。
- 
        
查看 Greengrass 的主日志文件。
sudo tail -f /greengrass/v2/logs/greengrass.log - 
        
验证 PKCS #11 提供商的配置。
sudo cat /greengrass/v2/config/effectiveConfig.yaml - 
        
确保 TPM2 服务正在运行。
sudo systemctl status tpm2-abrmd.service - 
        
验证 TPM2 密钥是否可访问。
sudo pkcs11-tool —module /usr/lib/x86_64-linux-gnu/pkcs11/libtpm2_pkcs11.so -l -p 123456 —list-objects - 
        
如果您的操作系统设置为使用 TPM2 存储根密钥(例如 Clevis 或 systemd-cryptenroll)进行全盘加密,请确认您使用的永久用户名与这些工具使用的永久性账号不同。使用相同的永久句柄可能会影响您的磁盘加密机制。要检查所有已创建和使用的永久句柄,请运行以下命令
sudo tpm2_getcap handles-persistent 
后续步骤
现在,您已成功将 Greengrass 核心设备与集成,您可以: TPM2
- 
        
将组件部署到您的安全 Greengrass 设备上。有关更多信息,请参阅 将 Amazon IoT Greengrass 组件部署到设备。
 - 
        
通过集成设置其他 Greengrass 设备。 TPM2
 
有关 Greengrass 设备安全的更多信息,请参阅。安全性 Amazon IoT Greengrass