

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

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

本教程介绍如何启用和配置 nu Amazon IoT Greengrass cleus lite 的可信平台模块 (TPM) 支持。TPM 为安全密钥存储提供基于硬件的信任根。此安全功能可保护加密操作和敏感凭证，从而增强设备的安全性和完整性。

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

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

**重要**  
只有通过手动资源配置安装 n Amazon IoT Greengrass ucleus lite 时，才支持此机制。

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

要完成本教程，您需要：
+ [一款兼容 Linux 的设备，配备 TPM 2.0 硬件或 NitroTPM](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/nitrotpm.html)
+ 一台安装了 Greengrass Nucleus Lite 的开发者机器。有关更多信息，请参阅[安装 Amazon IoT Greengrass 核心软件（控制台）](https://docs.amazonaws.cn//greengrass/v2/developerguide/install-greengrass-v2-console.html)。
+ 本教程中的说明是针对 Ubuntu 24.04 LTS 制定的。
+ 任何支持 Linux [ TPM2 软件堆栈的 Linux](https://tpm2-software.github.io/) 发行版都可以支持这种机制。
+ 一台开发者计算机，安装了 [Amazon CLI](https://docs.amazonaws.cn/cli/latest/userguide/getting-started-install.html) 并配置了以下权限：
  + 创建和管理 Amazon IoT 资源
  + 创建和管理 IAM 角色和策略
+ 设备上的 root 或 sudo 权限。

本教程包含有关如何使用 TPM2 芯片作为硬件安全模块 (HSM) 来创建私钥和用于创建 Amazon IoT 事物证书的 CSR 的说明。

## 第 1 步：设置 NitroTPM 实例
<a name="lite-tpm-step1"></a>

1. 设置一个 NitrotPM 实例。有关更多信息，请参阅 [nitroT](https://docs.amazonaws.cn//AWSEC2/latest/UserGuide/enable-nitrotpm-support-on-ami.html) PM。

1. 使用在上一步中创建的自定义 AMI 启动最终实例。
**重要**  
使用 SSH 连接时，请使用`ubuntu`用户代替`root`。

1. 运行以下命令，检查 TPM 设备是否存在且工作正常：

   ```
   ls -la /dev/tpm*
   ```

   你应该看到`/dev/tpm0`和`/dev/tpmrm0`设备。

## 第 2 步：安装和配置 TPM 工具
<a name="lite-tpm-step2"></a>

1. 通过运行以下命令安装所需的软件包：

   ```
   sudo apt update
   sudo apt install tpm2-openssl tpm2-tools tpm2-abrmd libtss2-tcti-tabrmd0
   ```

1. 运行以下命令验证 TPM 设备的权限：

   ```
   ls -l /dev/tpm0    # Should be owned by tss:root with permissions 0660
   ls -l /dev/tpmrm0  # Should be owned by tss:tss with permissions 0660
   ```

## 第 3 步：配置 OpenSSL TPM2 提供程序
<a name="lite-tpm-step3"></a>

1. 编辑 OpenSSL 配置文件：

   ```
   sudo vi /etc/ssl/openssl.cnf
   ```

1. 添加以下配置：

   ```
   [openssl_init]
   providers = provider_sect
   
   [provider_sect]
   default = default_sect
   tpm2 = tpm2_sect
   
   [default_sect]
   activate = 1
   
   [tpm2_sect]
   identity = tpm2
   module = /usr/local/lib64/tpm2.so
   activate = 1
   ```

1. 根据需要调整模块路径。你可以使用以下方法找到正确的路径：

   ```
   find /usr -name "tpm2.so"
   ```

## 步骤 4：生成永久性 TPM 密钥
<a name="lite-tpm-step4"></a>

1. 通过运行以下命令创建主键：

   ```
   sudo tpm2_createprimary -C o -c primary.ctx
   ```

1. 通过运行以下命令创建 ECC 密钥对象：

   ```
   sudo tpm2_create -C primary.ctx -g sha256 -G ecc256 -r device.priv -u device.pub
   ```

1. 通过运行以下命令加载密钥：

   ```
   sudo tpm2_load -C primary.ctx -r device.priv -u device.pub -c device.ctx
   ```

1. 通过运行以下命令使密钥永久化：

   ```
   sudo tpm2_evictcontrol -C o -c device.ctx 0x81000002
   ```

   这将创建一个带有手柄的永久密钥（比如`0x81000002`）。

## 步骤 5：生成证书签名请求 (CSR)
<a name="lite-tpm-step5"></a>

在此步骤中，您将使用 TPM2受保护的私钥生成证书签名请求 (CSR)。

1. 使用 TPM 密钥生成 CSR：

   ```
   openssl req -new -provider tpm2 -key "handle:0x81000002" \
       -out device.csr \
       -subj "/CN=TPMThing"
   ```

1. `0x81000002`替换为你选择的手柄值和`TPMThing`你想要的事物名称。

## 步骤 6：从 CSR 创建证书
<a name="lite-tpm-step6"></a>

1. 在您的开发计算机上，创建一个文件夹，用于下载该 Amazon IoT 事物的证书。

   ```
   mkdir greengrass-v2-certs
   ```

1. 使用 CSR 文件为该 Amazon IoT 事物创建证书并将其下载到您的开发计算机。

   ```
   aws iot create-certificate-from-csr \
     --set-as-active \
     --certificate-signing-request file://path_to_device.csr \
     --certificate-pem-outfile greengrass-v2-certs/device.pem.crt
   ```

   如果请求成功，将返回与以下示例类似的响应：

   ```
   {
   "certificateArn": "arn:aws:iot:us-west-2:123456789012:cert/aa0b7958770878eabe251d8a7ddd547f4889c524c9b574ab9fbf65f32248b1d4",
     "certificateId": "aa0b7958770878eabe251d8a7ddd547f4889c524c9b574ab9fbf65f32248b1d4",
     "certificatePem": "-----BEGIN CERTIFICATE-----
   MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w
    0BAQUFADCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZ
    WF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIw
    EAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5
    jb20wHhcNMTEwNDI1MjA0NTIxWhcNMTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBh
    MCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBb
    WF6b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMx
    HzAdBgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wgZ8wDQYJKoZIhvcNAQE
    BBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ21uUSfwfEvySWtC2XADZ4nB+BLYgVI
    k60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9TrDHudUZg3qX4waLG5M43q7Wgc/MbQ
    ITxOUSQv7c7ugFFDzQGBzZswY6786m86gpEIbb3OhjZnzcvQAaRHhdlQWIMm2nr
    AgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4nUhVVxYUntneD9+h8Mg9q6q+auN
    KyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0FkbFFBjvSfpJIlJ00zbhNYS5f6Guo
    EDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTbNYiytVbZPQUQ5Yaxu2jXnimvw
    3rrszlaEXAMPLE=
   -----END CERTIFICATE-----"
   }
   ```

## 第 7 步：设置支持 TPM 的 Greengrass Nucleus Lite
<a name="lite-tpm-step7"></a>

要在 Greengrass Nucleus Lite 中启用 TPM 支持，请进行以下更改：

1. 通过将用户添加到 TPM 访问`tss`群组来配置`ggcore`用户权限：

   ```
   sudo usermod -a -G tss ggcore
   ```

1. 完成以下步骤以更新凭证目录：
   + 从凭证目录中删除私钥文件。
     + 由于我们使用的是永久性 TPM 密钥，因此无需复制私钥文件。
   + 将新的证书复制`device.pem.crt`到该凭据目录中。

1. `config.yaml`使用以下 TPM 特定的配置进行编辑：

   ```
   system:
       privateKeyPath: "handle:0x81000002" # Use your chosen handle
       certificateFilePath: "" # Replace with the path of device.pem.crt
       ...
   ```

1. 运行以下命令重启你的 Greengrass Nucleus Lite：

   ```
   systemctl restart greengrass-lite.target
   ```

## 问题排查
<a name="lite-tpm-troubleshooting"></a>

如果您在设置或操作 TPM2启用该功能的 Amazon IoT Greengrass 设备时遇到问题，请尝试以下故障排除步骤：

**找不到 TPM 设备（使用 NitrotPM 时）**

如果`/dev/tpm0`不存在，请执行以下步骤：

1. 确认您使用的是受 NitrotPM 支持的实例类型。

1. 确保 AMI 是用创建的`--tpm-support v2.0`。

1. 确认该实例是从自定义 AMI 启动的。

**权限被拒绝错误**

如果您遇到 TPM 访问错误，请执行以下操作：

1. 验证用户是否在`tss`群组中：`groups $USER`。

1. 使用以下命令检查 TPM 设备的权限：

   ```
   ls -l /dev/tpm*
   ```

1. 加入`tss`群组后，请确认您已注销并重新登录。

**OpenSSL 提供程序问题**

如果找不到 TPM 提供商，请执行以下操作：

1. 验证中的`tpm2.so`路径`/etc/ssl/openssl.cnf`。

1. 通过运行以下命令来检查提供商的安装情况：

   ```
   openssl list -providers
   ```

1. 验证`tpm2-openssl`软件包是否已正确安装。

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

现在，您已成功将 Amazon IoT Greengrass 核心设备与集成 TPM2，您可以：
+ 将组件部署到您的安全 Amazon IoT Greengrass 设备
+ 通过 TPM2 集成设置其他 Amazon IoT Greengrass 设备

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