

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

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

# 将机密部署到 AWS IoT Greengrass core
<a name="secrets"></a>

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

**仅当您想要授予密码的 AWS 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.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。

   您可以明确列出密钥或使用通配符 `*` 命名方案来授予细粒度访问权限，也可以授予对受版本控制或标记的密钥的有条件访问权限。例如，以下策略仅 AWS 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}}"
               ]
           }
       ]
   }
   ```

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

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

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