

终止支持通知：2026 年 10 月 7 日， Amazon 将停止对的支持。 Amazon IoT Greengrass Version 1 2026 年 10 月 7 日之后，您将无法再访问这些 Amazon IoT Greengrass V1 资源。如需了解更多信息，请访问[迁移自 Amazon IoT Greengrass Version 1](https://docs.amazonaws.cn/greengrass/v2/developerguide/migrate-from-v1.html)。

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

# 将机密部署到核 Amazon IoT Greengrass 心
<a name="secrets"></a>

此功能适用于 Amazon IoT Greengrass 酷睿 v1.7 及更高版本。

Amazon IoT Greengrass 允许您使用 Greengrass 设备上的服务和应用程序进行身份验证，而无需对密码、令牌或其他机密进行硬编码。

Amazon Secrets Manager 是一项可用于在云端安全存储和管理密钥的服务。 Amazon IoT Greengrass 将 Secrets Manager 扩展到 Greengrass 核心设备，因此您的[连接器](connectors.md)和 Lambda 函数可以使用本地密钥与服务和应用程序进行交互。例如，Twilio Notifications 使用本地存储的身份验证令牌。

要将密钥集成到 Greengrass 组中，您需要创建一个引用 Secrets Manager 密钥的组资源。此*密钥资源*引用云密钥 ARN。要了解如何创建、管理和使用私有资源，请参阅[使用密钥资源](secrets-using.md)。

Amazon IoT Greengrass 在传输过程中和静止状态下对您的机密进行加密。在群组部署期间，从 Secrets Manager Amazon IoT Greengrass 获取密钥并在 Greengrass 核心上创建本地加密副本。在 Secrets Manager 中轮换您的云密钥后，重新部署组，将更新后的值传播到核心。

下图显示了将密钥部署到核心的简要过程。传输和静态中的密钥均经过加密。

![\[Amazon IoT Greengrass 从中获取密钥并将其作为秘密资源部署到核心设备，连接器 Amazon Secrets Manager 和 Lambda 函数可在核心设备上使用该密钥。\]](http://docs.amazonaws.cn/greengrass/v1/developerguide/images/deploy-local-secret.png)


使用 Amazon IoT Greengrass 在本地存储您的密钥具有以下优点：
+ **通过代码解耦（而非硬编码）。**这支持集中管理的凭证，并帮助保护敏感数据免受入侵的风险。
+ **适用于离线场景。**连接器和函数可以在 Internet 连接断开的情况下安全访问本地服务和软件。
+ **受控密钥访问。**只有组中经过授权的连接器和函数才可以访问您的密钥。 Amazon IoT Greengrass 使用私有密钥加密来保护您的密钥。传输和静态中的密钥均经过加密。有关更多信息，请参阅 [密钥加密](#secrets-encryption)。
+ **受控轮换。**在 Secrets Manager 中轮换您的密钥后，重新部署 Greengrass 组以更新密钥的本地副本。有关更多信息，请参阅 [创建和管理密钥](secrets-using.md#secrets-create-manage)。
**重要**  
Amazon IoT Greengrass 在轮换云版本后，不会自动更新本地密钥的值。要更新本地值，必须重新部署组。

## 密钥加密
<a name="secrets-encryption"></a>

Amazon IoT Greengrass 对传输中和静态的机密进行加密。

**重要**  
请确保用户定义的 Lambda 函数能够安全地处理密钥，并且不记录存储在密钥中的任何敏感数据。有关更多信息，请参阅 *Amazon Secrets Manager 用户指南*中的[降低记录和调试 Lambda 函数的风险](https://docs.amazonaws.cn/secretsmanager/latest/userguide/best-practices.html#best-practice_lamda-debug-statements)。尽管本文档特别提到了轮换函数，但该建议也适用于 Greengrass Lambda 函数。

**传输中加密**  
Amazon IoT Greengrass 使用传输层安全 (TLS) 对互联网和本地网络上的所有通信进行加密。这样可以在传输中保护密钥，在从 Secrets Manager 检索密钥并将其部署到核心时会发生此类情况。有关支持的 TLS 密码套件，请参阅[TLS 密码套件支持](gg-sec.md#gg-cipher-suites)。

**静态加密**  
Amazon IoT Greengrass 使用中指定的私钥[`config.json`](gg-core.md#config-json)对存储在核心上的机密进行加密。因此，私有密钥的安全存储对于保护本地密钥至关重要。在 Amazon [分担责任模式](https://www.amazonaws.cn/compliance/shared-responsibility-model/)中，客户有责任保证在核心设备上安全存储私钥。  
Amazon IoT Greengrass 支持两种私钥存储模式：  
+ 使用硬件安全模块。有关更多信息，请参阅 [硬件安全性集成](hardware-security.md)。
**注意**  
当前，在使用基于硬件的[私钥时，仅 Amazon IoT Greengrass 支持 PKCS \$11 v1.5](https://tools.ietf.org/html/rfc2313) 填充机制，用于加密和解密本地机密。如果您按照供应商提供的说明手动生成基于硬件的私钥，请务必选择 PKCS \$11 v1.5。 Amazon IoT Greengrass 不支持最佳非对称加密填充 (OAEP)。
+ 使用文件系统权限（默认）。
私有密钥用于保护数据密钥，数据密钥用于加密本地密钥。数据密钥随每次组部署进行轮换。  
 Amazon IoT Greengrass 核心是唯一有权访问私钥的实体。与密钥资源关联的 Greengrass 连接器或 Lambda 函数从核心获取密钥值。

## 要求
<a name="secrets-reqs"></a>

以下是本地密钥支持的要求：
+ 你必须使用 Amazon IoT Greengrass 酷睿 v1.7 或更高版本。
+ 要获取本地密钥的值，用户定义的 Lambda 函数必须使用 C Amazon IoT Greengrass ore SDK 1.3.0 或更高版本。
+ 用于本地密钥加密的私有密钥必须在 Greengrass 配置文件中指定。默认情况下， Amazon IoT Greengrass 使用存储在文件系统中的核心私钥。要提供您自己的私有密钥，请参阅[指定用于密钥加密的私有密钥](#secrets-config-private-key)。仅支持 RSA 密钥类型。
**注意**  
当前，在使用基于硬件的[私钥时，仅 Amazon IoT Greengrass 支持 PKCS \$11 v1.5](https://tools.ietf.org/html/rfc2313) 填充机制，用于加密和解密本地机密。如果您按照供应商提供的说明手动生成基于硬件的私钥，请务必选择 PKCS \$11 v1.5。 Amazon IoT Greengrass 不支持最佳非对称加密填充 (OAEP)。
+ Amazon IoT Greengrass 必须获得权限才能获取您的密钥值。这 Amazon IoT Greengrass 允许在群组部署期间获取值。*如果你使用的是默认 Greengrass 服务角色， Amazon IoT Greengrass 那么已经可以访问名称以 greengrass-开头的机密了。*要自定义访问权限，请参阅[允许 Amazon IoT Greengrass 获取秘密值](#secrets-config-service-role)。
**注意**  
我们建议您使用此命名约定来识别允许访问的机密，即使您自定义权限 Amazon IoT Greengrass 也是如此。控制台使用不同的权限来读取您的密钥，因此您可以在控制台中选择 Amazon IoT Greengrass 没有获取权限的密钥。使用命名约定有助于避免权限冲突，这会导致部署错误。

## 指定用于密钥加密的私有密钥
<a name="secrets-config-private-key"></a>

在此过程中，您将提供用于本地秘密加密的私有密钥的路径。这必须是最小长度为 2048 位 RSA 密钥。有关 Amazon IoT Greengrass 核心上使用的私钥的更多信息，请参阅[Amazon IoT Greengrass 核心安全主体](gg-sec.md#gg-principals)。

Amazon IoT Greengrass 支持两种私钥存储模式：基于硬件或基于文件系统（默认）。有关更多信息，请参阅 [密钥加密](#secrets-encryption)。

请仅在您想更改默认配置（其使用文件系统中的核心私有密钥）时，**此按照此过程操作**。我们在编写这些步骤时假设您创建了组和核心，如入门教程中的[模块 2](module2.md) 所述。

1. 打开 [`config.json`](gg-core.md#config-json) 文件（位于 `/greengrass-root/config` 目录中）。
**注意**  
*greengrass-root*表示 C Amazon IoT Greengrass ore 软件在您的设备上的安装路径。通常，这是 `/greengrass` 目录。

1. 在 `crypto.principals.SecretsManager` 对象中，对于 `privateKeyPath` 属性，输入私有密钥的路径：
   + 如果您的私有密钥存储在文件系统中，请指定该密钥的绝对路径。例如：

     ```
     "SecretsManager" : {
       "privateKeyPath" : "file:///somepath/hash.private.key"
     }
     ```
   + 如果私有密钥存储在硬件安全模块 (HSM) 中，请使用 [RFC 7512 PKCS\$111](https://tools.ietf.org/html/rfc7512) URI 方案指定路径：例如：

     ```
     "SecretsManager" : {
       "privateKeyPath" : "pkcs11:object=private-key-label;type=private"
     }
     ```

     有关更多信息，请参阅 [内 Amazon IoT Greengrass 核的硬件安全配置](hardware-security.md#configure-hardware-security)。
**注意**  
当前，在使用基于硬件的[私钥时，仅 Amazon IoT Greengrass 支持 PKCS \$11 v1.5](https://tools.ietf.org/html/rfc2313) 填充机制，用于加密和解密本地机密。如果您按照供应商提供的说明手动生成基于硬件的私钥，请务必选择 PKCS \$11 v1.5。 Amazon IoT Greengrass 不支持最佳非对称加密填充 (OAEP)。

## 允许 Amazon IoT Greengrass 获取秘密值
<a name="secrets-config-service-role"></a>

在此过程中，您将向 Greengrass 服务角色添加 Amazon IoT Greengrass 允许获取密钥值的内联策略。

**仅当您想要授予密码的 Amazon IoT Greengrass 自定义权限或您的 Greengrass 服务角色不包含托管策略时，才按照此步骤**操作。`AWSGreengrassResourceAccessRolePolicy` `AWSGreengrassResourceAccessRolePolicy`允许访问名称以 *greengr* ass-开头的机密。

1. 运行以下 CLI 命令以获取 Greengrass 服务角色的 ARN：

   ```
   aws greengrass get-service-role-for-account --region region
   ```

   返回的 ARN 包含角色名称。

   ```
   {
     "AssociatedAt": "time-stamp",
     "RoleArn": "arn:aws:iam::account-id:role/service-role/role-name"
   }
   ```

   您将在以下步骤中使用 ARN 或名称。

1. 添加允许 `secretsmanager:GetSecretValue` 操作的内联策略。有关说明，请参阅 *IAM 用户指南*中的[添加和删除 IAM policy](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。

   您可以明确列出密钥或使用通配符 `*` 命名方案来授予细粒度访问权限，也可以授予对受版本控制或标记的密钥的有条件访问权限。例如，以下策略仅 Amazon IoT Greengrass 允许读取指定的密钥。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "secretsmanager:GetSecretValue"
               ],
               "Resource": [
               "arn:aws:secretsmanager:us-east-1:123456789012:secret:greengrass-SecretA-abc",
       "arn:aws:secretsmanager:us-east-1:123456789012:secret:greengrass-SecretB-xyz"
               ]
           }
       ]
   }
   ```

------
**注意**  
如果您使用客户管理的密 Amazon KMS 钥来加密机密，则您的 Greengrass 服务角色也必须允许该操作。`kms:Decrypt`

有关密钥管理器的 IAM policy 的详细信息，请参阅《Amazon Secrets Manager 用户指南》**中的 [Amazon Secrets Manager的身份验证和访问控制](https://docs.amazonaws.cn/secretsmanager/latest/userguide/auth-and-access.html)以及[可以在 IAM policy 或密钥策略中针对 Amazon Secrets Manager使用的操作、资源和上下文密钥](https://docs.amazonaws.cn/secretsmanager/latest/userguide/reference_iam-permissions.html)。

## 另请参阅
<a name="secrets-seealso"></a>
+ [什么是 Amazon Secrets Manager？](https://docs.amazonaws.cn/secretsmanager/latest/userguide/intro.html) 在《*Amazon Secrets Manager 用户指南》*中
+ [PKCS \$11：RSA 加密版本 1.5](https://tools.ietf.org/html/rfc2313)