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

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

检索密钥值

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

最低 SDK 版本

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

Authorization

要在自定义组件中使用密钥管理器,必须定义授权策略,允许您的组件获取存储在核心设备上的密钥的值。有关定义授权策略的信息,请参阅授权组件执行 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 云. 有关更多信息,请参阅《Amazon Secrets Manager API 参考》中的 GetSecretValue

请求

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

secretId(Pyththon:secret_id)

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

versionId(Pyththon:version_id)

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

您可指定 versionIdversionStage

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

versionStage(Pyththon:version_stage)

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

您可指定 versionIdversionStage

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

响应

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

secretId(Pyththon:secret_id)

密钥的 ID

versionId(Pyththon:version_id)

此版本的密钥版本的 ID

versionStage(Pyththon:version_stage)

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

secretValue(Pyththon:secret_value)

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

secretString(Pyththon:secret_string)

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

secretBinary(Pyththon:secret_binary)

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

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

示例

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

Java (IPC client V1)

例 示例:获取密钥值

注意

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

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 (IPC client V1)

例 示例:获取密钥值

注意

此示例假设您使用的是 1.5.4 或更高版本的Amazon IoT Device SDKfor Python vice 如果您使用的是 SDK 的版本 1.5.3,请参阅使用Amazon IoT Device SDK适用于 Python v2(IPC 客户端 V1)获取有关连接到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) future_response = operation.get_response() response = future_response.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) future_response = operation.get_response() try: response = future_response.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)

用量

您可以将此示例组件与密钥管理器组件在您的核心设备上部署和打印密钥的值。

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

  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,以便在以下步骤中使用 ARN,以便在以下步骤中使用。

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

  2. 部署密钥管理器组件(aws.greengrass.SecretManager) 使用以下配置合并更新。指定您之前创建的密钥的 ARN

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

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

  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圆木