检索密钥值 - Amazon IoT Greengrass
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

检索密钥值

使用密钥管理器 IPC 服务从核心设备上的密钥中检索密钥值。您将Secrets Manager 组件将加密的密钥部署到核心设备。然后,您可以使用 IPC 操作解密密码并在自定义组件中使用其值。

最低 SDK 版本

下表列出了的最低版本。Amazon IoT Device SDK必须使用它从核心设备上的密钥中检索密钥值。

SDK 最低版本

Amazon IoT Device SDK对于 Java v2

v1.2.10

Amazon IoT Device SDK对于 Python v2

v1.5.3

Amazon IoT Device SDK对于 C++ v2

Linux:v1.13.0;视窗:v1.14.6

授权

要在自定义组件中使用密钥管理器,必须定义授权策略,以允许组件获取存储在核心设备上的密钥的价值。有关定义授权策略的信息,请参阅授权组件执行 IPC 操作.

密钥管理器的授权策略具有以下属性。

IPC 服务标识符: aws.greengrass.SecretManager

运算 描述 资源

aws.greengrass#GetSecretValue 或者 *

允许组件获取核心设备上加密的密钥的价值。

Secrets Manager 的秘密 ARN,或者*允许访问所有秘密。

例 授权策略示例

以下示例授权策略允许组件获取核心设备上任何密钥的值。

注意

我们建议在生产环境中缩小授权策略的范围,以便组件只检索它使用的密钥。您可以更改*部署组件时的秘密 ARN 列表中的通配符。

{ "accessControl": { "aws.greengrass.SecretManager": { "com.example.MySecretComponent:secrets:1": { "policyDescription": "Allows access to a secret.", "operations": [ "aws.greengrass#GetSecretValue" ], "resources": [ "*" ] } } } }

GetSecretValue

获取存储在核心设备上的密钥的价值。

此操作类似于秘 Secrets Manager 操作,您可以使用该操作在Amazon Web Services 云. 有关更多信息,请参阅 。GetSecretValue中的Amazon Secrets ManagerAPI 参考.

请求

此操作的请求具有以下参数:

secretId

要获取的密钥的名称。您可以指定密钥的 Amazon 资源名称 (ARN) 或易记名称。

versionId

(可选)要获取的版本的 ID。

您可指定 versionIdversionStage

如果不指定versionId要么versionStage,此操作默认为具有AWSCURRENT标签。

versionStage

(可选)要获取的版本的暂存标签。

您可指定 versionIdversionStage

如果不指定versionId要么versionStage,此操作默认为具有AWSCURRENT标签。

响应

此操作的响应包含以下信息:

secretId

密钥的 ID。

versionId

密钥的此版本的 ID。

versionStage

附加到此密钥版本的暂存标签列表。

secretValue

密钥的此版本的值。这对象,SecretValue,包含以下信息。

secretString

您以字符串形式提供给 Secret Manager 的受保护机密信息的解密部分。

secretBinary

(可选)作为二进制数据以字节数组的形式提供给 Secret Manager 的受保护机密信息的解密部分。此属性包含以 base64 编码字符串的形式的二进制数据。

如果您在 Secrets Manager 控制台中创建密钥,则不使用此属性。

示例

以下示例演示如何在自定义组件代码中调用此操作。

Java

例如:获取密钥值

注意

此示例使用IPCUtils类来创建到Amazon IoT Greengrass核心 IPC 服务。有关更多信息,请参阅 Connect 到Amazon IoT GreengrassIPC 核心服务

package com.aws.greengrass.docs.samples.ipc; import com.aws.greengrass.docs.samples.ipc.util.IPCUtils; import software.amazon.awssdk.aws.greengrass.GetSecretValueResponseHandler; import software.amazon.awssdk.aws.greengrass.GreengrassCoreIPCClient; import software.amazon.awssdk.aws.greengrass.model.GetSecretValueRequest; import software.amazon.awssdk.aws.greengrass.model.GetSecretValueResponse; import software.amazon.awssdk.aws.greengrass.model.UnauthorizedError; import software.amazon.awssdk.eventstreamrpc.EventStreamRPCConnection; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class GetSecretValue { public static final int TIMEOUT_SECONDS = 10; public static void main(String[] args) { String secretArn = args[0]; String versionStage = args[1]; try (EventStreamRPCConnection eventStreamRPCConnection = IPCUtils.getEventStreamRpcConnection()) { GreengrassCoreIPCClient ipcClient = new GreengrassCoreIPCClient(eventStreamRPCConnection); GetSecretValueResponseHandler responseHandler = GetSecretValue.getSecretValue(ipcClient, secretArn, versionStage); CompletableFuture<GetSecretValueResponse> futureResponse = responseHandler.getResponse(); try { GetSecretValueResponse response = futureResponse.get(TIMEOUT_SECONDS, TimeUnit.SECONDS); response.getSecretValue().postFromJson(); String secretString = response.getSecretValue().getSecretString(); System.out.println("Successfully retrieved secret value: " + secretString); } catch (TimeoutException e) { System.err.println("Timeout occurred while retrieving secret: " + secretArn); } catch (ExecutionException e) { if (e.getCause() instanceof UnauthorizedError) { System.err.println("Unauthorized error while retrieving secret: " + secretArn); } else { throw e; } } } catch (InterruptedException e) { System.out.println("IPC interrupted."); } catch (ExecutionException e) { System.err.println("Exception occurred when using IPC."); e.printStackTrace(); System.exit(1); } } public static GetSecretValueResponseHandler getSecretValue(GreengrassCoreIPCClient greengrassCoreIPCClient, String secretArn, String versionStage) { GetSecretValueRequest getSecretValueRequest = new GetSecretValueRequest(); getSecretValueRequest.setSecretId(secretArn); getSecretValueRequest.setVersionStage(versionStage); return greengrassCoreIPCClient.getSecretValue(getSecretValueRequest, Optional.empty()); } }
Python

例如:获取密钥值

注意

此示例假定您正在使用版本 1.5.4 或更高版本Amazon IoT Device SDK对于 Python v2。如果您使用的是 SDK 版本 1.5.3,请参阅使用Amazon IoT Device SDK适用于 Python v2有关连接到Amazon IoT Greengrass核心 IPC 服务。

import json import awsiot.greengrasscoreipc from awsiot.greengrasscoreipc.model import ( GetSecretValueRequest, GetSecretValueResponse, UnauthorizedError ) secret_id = 'arn:aws:secretsmanager:us-west-2:123456789012:secret:MyGreengrassSecret-abcdef' TIMEOUT = 10 ipc_client = awsiot.greengrasscoreipc.connect() request = GetSecretValueRequest() request.secret_id = secret_id request.version_stage = 'AWSCURRENT' operation = ipc_client.new_get_secret_value() operation.activate(request) futureResponse = operation.get_response() response = futureResponse.result(TIMEOUT) secret_json = json.loads(response.secret_value.secret_string) # Handle secret value.

示例

使用以下示例了解如何在组件中使用密钥管理器 IPC 服务。

此示例组件打印您部署到核心设备的密钥的价值。

重要

此示例组件打印密钥的值,因此只能与存储测试数据的密钥一起使用。不要使用此组件来打印存储重要信息的秘密的价值。

Recipe

以下示例配方定义了秘密 ARN 配置参数,并允许组件获取核心设备上任何密钥的值。

注意

我们建议在生产环境中缩小授权策略的范围,以便组件只检索它使用的密钥。您可以更改*部署组件时的秘密 ARN 列表中的通配符。

JSON
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.PrintSecret", "ComponentVersion": "1.0.0", "ComponentDescription": "Prints the value of an Amazon Secrets Manager secret.", "ComponentPublisher": "Amazon", "ComponentDependencies": { "aws.greengrass.SecretManager": { "VersionRequirement": "^2.0.0", "DependencyType": "HARD" } }, "ComponentConfiguration": { "DefaultConfiguration": { "SecretArn": "", "accessControl": { "aws.greengrass.SecretManager": { "com.example.PrintSecret:secrets:1": { "policyDescription": "Allows access to a secret.", "operations": [ "aws.greengrass#GetSecretValue" ], "resources": [ "*" ] } } } } }, "Manifests": [ { "Platform": { "os": "linux" }, "Lifecycle": { "Install": "python3 -m pip install --user awsiotsdk", "Run": "python3 -u {artifacts:path}/print_secret.py \"{configuration:/SecretArn}\"" } }, { "Platform": { "os": "windows" }, "Lifecycle": { "Install": "py -3 -m pip install --user awsiotsdk", "Run": "py -3 -u {artifacts:path}/print_secret.py \"{configuration:/SecretArn}\"" } } ] }
YAML
--- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.PrintSecret ComponentVersion: 1.0.0 ComponentDescription: Prints the value of a Secrets Manager secret. ComponentPublisher: Amazon ComponentDependencies: aws.greengrass.SecretManager: VersionRequirement: "^2.0.0" DependencyType: HARD ComponentConfiguration: DefaultConfiguration: SecretArn: '' accessControl: aws.greengrass.SecretManager: com.example.PrintSecret:secrets:1: policyDescription: Allows access to a secret. operations: - aws.greengrass#GetSecretValue resources: - "*" Manifests: - Platform: os: linux Lifecycle: Install: python3 -m pip install --user awsiotsdk Run: python3 -u {artifacts:path}/print_secret.py "{configuration:/SecretArn}" - Platform: os: windows Lifecycle: Install: py -3 -m pip install --user awsiotsdk Run: py -3 -u {artifacts:path}/print_secret.py "{configuration:/SecretArn}"

Artifacts

以下示例 Python 应用程序演示了如何使用密钥管理器 IPC 服务获取核心设备上的密钥的价值。

import concurrent.futures import json import sys import traceback import awsiot.greengrasscoreipc from awsiot.greengrasscoreipc.model import ( GetSecretValueRequest, GetSecretValueResponse, UnauthorizedError ) TIMEOUT = 10 if len(sys.argv) == 1: print('Provide SecretArn in the component configuration.', file=sys.stdout) exit(1) secret_id = sys.argv[1] try: ipc_client = awsiot.greengrasscoreipc.connect() request = GetSecretValueRequest() request.secret_id = secret_id operation = ipc_client.new_get_secret_value() operation.activate(request) futureResponse = operation.get_response() try: response = futureResponse.result(TIMEOUT) secret_json = json.loads(response.secret_value.secret_string) print('Successfully got secret: ' + secret_id) print('Secret value: ' + str(secret_json)) except concurrent.futures.TimeoutError: print('Timeout occurred while getting secret: ' + secret_id, file=sys.stderr) except UnauthorizedError as e: print('Unauthorized error while getting secret: ' + secret_id, file=sys.stderr) raise e except Exception as e: print('Exception while getting secret: ' + secret_id, file=sys.stderr) raise e except Exception: print('Exception occurred when using IPC.', file=sys.stderr) traceback.print_exc() exit(1)

用量

您可以将此示例组件与Secrets Manager 组件在核心设备上部署和打印密码的价值。

创建、部署和打印测试密钥

  1. 使用测试数据创建 Secrets Manager 密钥。

    Linux or Unix
    aws secretsmanager create-secret \ --name MyTestGreengrassSecret \ --secret-string '{"my-secret-key": "my-secret-value"}'
    Windows Command Prompt (CMD)
    aws secretsmanager create-secret ^ --name MyTestGreengrassSecret ^ --secret-string '{"my-secret-key": "my-secret-value"}'
    PowerShell
    aws secretsmanager create-secret ` --name MyTestGreengrassSecret ` --secret-string '{"my-secret-key": "my-secret-value"}'

    保存要在以下步骤中使用的密钥的 ARN。

    有关更多信息,请参阅 。创建密钥中的Amazon Secrets Manager用户指南.

  2. 部署Secrets Manager 组件(aws.greengrass.SecretManager) 具有以下配置合并更新。指定您之前创建的密钥的 ARN。

    { "cloudSecrets": [ { "arn": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestGreengrassSecret-abcdef" } ] }

    有关更多信息,请参阅 。部署Amazon IoT Greengrass组件到设备或者Greengrass CLI 部署命令.

  3. 使用以下配置合并更新在本节中创建和部署示例组件。指定您之前创建的密钥的 ARN。

    { "SecretArn": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestGreengrassSecret", "accessControl": { "aws.greengrass.SecretManager": { "com.example.PrintSecret:secrets:1": { "policyDescription": "Allows access to a secret.", "operations": [ "aws.greengrass#GetSecretValue" ], "resources": [ "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestGreengrassSecret-abcdef" ] } } } }

    有关更多信息,请参阅 。CreateAmazon IoT Greengrass组件

  4. 查看Amazon IoT Greengrass用于验证部署是否成功的核心软件日志,然后查看com.example.PrintSecret组件日志以查看打印的密钥值。有关更多信息,请参阅显示器Amazon IoT Greengrass圆木