

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 教程：使用可信平台模块 (TPM) 保护 Greengrass Nucleus
<a name="gg-with-tpm-tutorial"></a>

**注意**  
本教程中的机制仅支持 [使用手动资源配置来安装 Amazon IoT Greengrass Core 软件](manual-installation.md)。

这些教程包含有关如何使用该 TPM2 芯片作为硬件安全模块 (HSM) 来创建私钥和 CSR 的说明。这用于 [创建事物证书](manual-installation.md#create-thing-certificate)。

这些教程向您展示了如何使用 PKCS \#11 接口配置带有可信平台模块 (TPM) 的 Amazon IoT Greengrass 核心软件 (Greengrass Nucleus)，从而增强设备安全性。这种 TPM 集成可确保用于设备识别和连接的私钥和证书安全地存储在防篡改的硬件中，防止因冒充或其他恶意活动而 Amazon IoT Core 被提取。

完成此集成后，您的 Greengrass 核心设备将使用受 TPM 保护的私钥进行身份识别和与服务的通信。 Amazon IoT 

有关 Greengrass 设备上安全的更多信息，请参阅[安全性 Amazon IoT Greengrass](security.md)。

## 先决条件
<a name="prerequisites"></a>

要完成本教程，您需要：
+ 一台兼容 Linux 的设备，配备 TPM 2.0 硬件或 TPM 2.0 固件。
+ 本教程中的说明是针对 Ubuntu 24.04 LTS 制定的。
  + 任何支持 Linux [ TPM2 软件堆栈的 Linux](https://tpm2-software.github.io/) 发行版都可以支持这种机制。
+ 一台开发者计算机， Amazon CLI 安装并配置了以下权限：
  + 创建和管理 Amazon IoT 资源
  + 创建和管理 IAM 角色和策略
+ 您的设备安装了 Java 运行时环境（JRE）版本 8 或更高版本。
+ 您的设备上安装了以下软件包：
  + curl
  + jq
+ 设备上的 root 或 sudo 权限。

## 步骤 1：安装 TPM2 工具和依赖项
<a name="tpm_step1"></a>

在此步骤中，您将安装必要的 TPM2 软件工具和库。

1. 通过运行以下命令更新您的软件包管理器并安装 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
   ```

1. 在 Ubuntu 24.04 上安装使用 OpenSSL 引擎 3 的 OpenSSL TPM2 提供程序包。

   ```
   sudo apt-get install tpm2-openssl
   ```

## 步骤 2：初始化 PKCS \#11 存储并创建槽位
<a name="tpm_step2"></a>

1. 创建存储数据的目录。

   ```
   sudo mkdir -p /etc/tpm2_pkcs11
   ```

1. 将存储位置设置为环境变量。有关存储层次结构的更多信息，请参阅[初始化](https://github.com/tpm2-software/tpm2-pkcs11/blob/master/docs/INITIALIZING.md#initialization)。

   ```
   export TPM2_PKCS11_STORE=/etc/tpm2_store
   ```

1. 用主对象初始化 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：创建令牌和密钥
<a name="tpm_step3"></a>

1. 创建 PKCS \#11 令牌。

   ```
   sudo tpm2_ptool addtoken —pid=1 —userpin={{USERPIN}} —sopin={{SOPIN}} —label=greengrass
   ```

   可用选项如下：  
`--pid PID`  
与此令牌关联的主对象 ID。  
`--sopin SOPIN`  
管理员 PIN。该 PIN 用于恢复对象。  
`--userpin USERPIN`  
用户 PIN。该 PIN 用于验证使用对象的身份。  
`--label LABEL`  
用于识别在用配置文件的唯一标签，必须是保持唯一性。  
`--hierarchy-auth HIERARCHY_AUTH`  


1. 创建 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\_AUTHENTICATE 属性设置为 CK\_TRUE。  
`--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}  
 密钥的类型。

1. 从令牌中导出 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 密钥的更多信息，请参阅[存储私钥或公](https://github.com/tpm2-software/tpm2-openssl/blob/master/docs/keys.md#storing-the-private-or-a-public-key)钥。

1. 获取 TSS 私钥的身份验证数据。

   ```
   auth_ecc0=$(echo "$yaml_ecc0" | grep "object-auth" | cut -d' ' -f2-)
   ```

## 步骤 4：生成证书签名请求（CSR）
<a name="step4"></a>

在此步骤中，您将使用 TPM2受保护的私钥生成 CSR。

1. 使用 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 文档](https://docs.openssl.org/3.0/man1/openssl-req/#standard-commands)。

1. 如果您不是在同一台计算机上生成 CSR，请将生成的 CSR 复制到配置了 Amazon 凭据的计算机上。

## 步骤 5：创建事物证书
<a name="step5"></a>

创建 Amazon IoT 事物证书。有关如何创建事物证书的更多信息，请参阅[创建事物证书](manual-installation.md#create-thing-certificate)。

## 步骤 6：将事物证书导入 TPM
<a name="step6"></a>

1. 将事物证书复制至设备。

1. 将事物证书添加至 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 对象网址
<a name="step7"></a>

我们将使用`gnutls-bin`软件包中`p11tool`提供的来获取 PKCS \#11 令牌 URL 和对象 URLs。

1. 获取 Greengrass 令牌的令牌网址。

   ```
   TOKEN=sudo p11tool --list-token-urls | grep "token=greengrass"
   ```

1. 获取 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
   ```

1. 获取私钥和证书的对象网址。

## 第 8 步：配置并安装支持的 Greengrass TPM2
<a name="step8"></a>

1. 配置事物证书。有关更多信息，请参阅[配置事物证书](https://docs.amazonaws.cn/greengrass/v2/developerguide/manual-installation.html#configure-thing-certificate)。

1. 在 HSM 中完成使用私钥和证书安装 C Amazon IoT Greengrass ore 软件的说明。[安装 Amazon IoT Greengrass 核心软件](manual-installation.md#run-greengrass-core-v2-installer-manual)然后，使用以下步骤将您的安装配置为 TPM2 通过 PKCS \#11 接口进行利用。

1. 确认已下载 PKCS \#11 提供程序组件，并将其保存在 Greengrass 安装程序位置。

1. 使用文本编辑器创建名为 `config.yaml` 的配置文件，以提供给安装程序。例如，在基于 Linux 的系统上，您可以运行以下命令来使用 GNU `nano` 创建该文件。

   ```
   nano GreengrassInstaller/config.yaml
   ```

1. 将以下 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"
   ```

1. 使用您的安装的特定参数编辑文件。

   1.  privateKeyPath 使用更新 certificateFilePath 和步骤 7 中捕获的 PKCS \#11 网址进行更新 certificateFilePath。 privateKeyPath 

   1.  iotCredEndpoint 根据您的 Amazon IoT 终端节点更新您的 iotDataEndpoint 和。

   1. 在 `aws.greengrass.crypto.Pkcs11Provider` 配置中，根据您的平台更新库。
**注意**  
所示示例适用于 X86\_64。 ARM64设备的文件路径将与之类似。

1. 完成中 [安装 Amazon IoT Greengrass 核心软件](manual-installation.md#run-greengrass-core-v2-installer-manual) 的 Greengrass 安装步骤。

## 步骤 9：验证安装
<a name="step9"></a>

在此步骤中，您将通过集成验证 Greengrass 是否正常运行。 TPM2 

1. 检查 Greengrass 服务状态。

   ```
   sudo systemctl status greengrass.service
   ```

1. 查看 Greengrass 日志，确保没有出错。

   ```
   sudo tail -f /greengrass/v2/logs/greengrass.log
   ```

1. 确认设备在[Amazon IoT 控制台](https://console.amazonaws.cn/iot)中显示为已连接。

   1. 登录 [Amazon IoT Greengrass 控制台](https://console.amazonaws.cn/greengrass)。

   1. 在**管理**下，展开 **Greengrass 设备**，然后选择**核心设备**。

   1. 确认您的设备已连接。如果已连接，设备状态将显示 `HEALTHY`。有关更多信息，请参阅 [检查 Greengrass 核心设备状态](device-status.md)。

## 问题排查
<a name="troubleshoot"></a>

如果您在设置或操作 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
  ```

## 后续步骤
<a name="next-steps"></a>

现在，您已成功将 Greengrass 核心设备与集成，您可以： TPM2
+ 将组件部署到安全的 Greengrass 设备上。有关更多信息，请参阅 [将 Amazon IoT Greengrass 组件部署到设备](manage-deployments.md)。
+ 设置更多具有集成功能的 Greengrass 设备。 TPM2 

有关 Greengrass 设备上安全的更多信息，请参阅[安全性 Amazon IoT Greengrass](security.md)。