AWS IoT Greengrass Version 1 2023 年 6 月 30 日进入延长寿命阶段。有关更多信息,请参阅 AWS IoT Greengrass V1 维护策略。在此日期之后,将 AWS IoT Greengrass V1 不会发布提供功能、增强功能、错误修复或安全补丁的更新。在上面运行的设备 AWS IoT Greengrass V1 不会中断,将继续运行并连接到云端。我们强烈建议您迁移到 AWS IoT Greengrass Version 2,这样可以添加重要的新功能并支持其他平台。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
硬件安全性集成
此功能适用于 AWS IoT Greengrass 酷睿 v1.7 及更高版本。
AWS IoT Greengrass 支持通过 PKCS #11 接口使用硬件安全模块 (HSM) 来安全存储和卸载私钥。这样可防止密钥在软件中暴露或重复。私钥可以安全地存储在硬件模块上 HSMs,例如可信平台模块 (TPM) 或其他加密元素。
在AWS Partner 设备目录
下图显示了内 AWS IoT Greengrass 核的硬件安全架构。

在标准安装中, AWS IoT Greengrass 使用两个私钥。Greengrass 内核连接时,客户 AWS IoT 端(物联网客户端)组件在传输层安全 (TLS) 握手期间使用一个密钥。 AWS IoT Core(此密钥也称为核心私有密钥。) 另一个密钥由本地 MQTT 服务器使用,它使 Greengrass 设备能够与 Greengrass 核心进行通信。如果您要为这两个组件使用硬件安全性,可以使用共享私有密钥或单独的私有密钥。有关更多信息,请参阅 AWS IoT Greengrass 硬件安全的配置实践。
注意
对于标准安装,本地 Secrets Manager 还对其加密过程使用 IoT 客户端密钥,但您可以使用您自己的私有密钥。它必须是最小长度为 2048 位的 RSA 密钥。有关更多信息,请参阅 指定用于密钥加密的私有密钥。
要求
在为 Greengrass 核心配置硬件安全性之前,您必须具备以下对象:
-
一个硬件安全模块 (HSM),可支持您的用于 IoT 客户端、本地 MQTT 服务器和本地 Secrets Manager 组件的目标私有密钥配置。该配置可以包含一个、两个或三个基于硬件的私有密钥,具体取决于您是否配置组件共享密钥。有关私有密钥支持的更多信息,请参阅 AWS IoT Greengrass 核心安全主体。
对于 RSA 密钥:RSA-2048 密钥大小(或更大)和 PKCS # 1 1.5 版本签名方案。
对于 EC 密钥:NIST P-256 或 NIST P-384 曲线。
注意
在AWS Partner 设备目录
中搜索符合此功能条件的设备。 -
一个 PKCS#11 提供程序库,可在运行时加载(使用 libdl)并提供 PKCS#11 函数。
-
硬件模块必须可按槽标签解析,如 PKCS#11 规范所定义。
-
私有密钥必须使用供应商提供的预配置工具在 HSM 上生成和加载。
-
私有密钥必须由对象标签来解析。
-
核心设备证书。这是与私有密钥对应的 IoT 客户端证书。
-
如果使用的是 Greengrass OTA 更新代理,则必须安装 OpenSSL libp11 PKCS#11
包装程序库。有关更多信息,请参阅 配置对 over-the-air更新的支持。
此外,确保满足以下条件:
-
与私钥关联的 IoT 客户端证书已在中注册 AWS IoT 并激活。你可以在 AWS IoT 控制台的 “管理” 下进行验证,展开 “所有设备”,选择 “事物”,然后为核心内容选择 “证书” 选项卡。
-
AWS IoT Greengrass 核心软件 v1.7 或更高版本安装在核心设备上,如入门教程的模块 2 中所述。对 MQTT 服务器使用 EC 密钥需要 1.9 或更高版本。
-
将证书附加到 Greengrass 核心。您可以从 AWS IoT 控制台的核心内容的 “管理” 页面进行验证。
注意
目前, AWS IoT Greengrass 不支持直接从 HSM 加载 CA 证书或 IoT 客户端证书。证书必须以纯文本文件形式加载到文件系统中 Greengrass 可读取的位置。
内 AWS IoT Greengrass 核的硬件安全配置
硬件安全性在 Greengrass 配置文件中进行配置。这是 config.json 文件(位于 /
目录中)。greengrass-root
/config
注意
要演练使用纯软件实施来设置 HSM 配置的过程,请参阅 模块 7:模拟硬件安全集成。
重要
示例中的模拟配置不提供任何安全优势。它只是让您了解 PKCS#11 规范,并在将来计划使用基于硬件的 HSM 时对软件进行初始测试。
要在中配置硬件安全 AWS IoT Greengrass,请在中编辑crypto
对象config.json
。
使用硬件安全性时,crypto
对象用于在核心上为 PKCS#11 提供程序库指定证书、私有密钥和资产的路径,如以下示例所示。
"crypto": {
"PKCS11" : {
"OpenSSLEngine" : "/path-to-p11-openssl-engine
",
"P11Provider" : "/path-to-pkcs11-provider-so
",
"slotLabel" : "crypto-token-name
",
"slotUserPin" : "crypto-token-user-pin
"
},
"principals" : {
"IoTCertificate" : {
"privateKeyPath" : "pkcs11:object=core-private-key-label
;type=private",
"certificatePath" : "file:///path-to-core-device-certificate
"
},
"MQTTServerCertificate" : {
"privateKeyPath" : "pkcs11:object=server-private-key-label
;type=private"
},
"SecretsManager" : {
"privateKeyPath": "pkcs11:object=core-private-key-label
;type=private"
}
},
"caPath" : "file:///path-to-root-ca
"
crypto
对象包含以下属性:
字段 | 描述 | 备注 |
---|---|---|
caPath |
AWS IoT 根 CA 的绝对路径。 |
必须为以下格式的文件 URI: 注意确保您的终端节点与证书类型对应。 |
PKCS11 |
||
OpenSSLEngine |
可选。OpenSSL 引擎 |
必须是文件系统上的文件的路径。 如果您使用 Greengrass OTA 更新代理来实现硬件安全性,则此属性是必需的。有关更多信息,请参阅 配置对 over-the-air更新的支持。 |
P11Provider |
PKCS#11 实施的 libdl-loadable 库的绝对路径。 |
必须是文件系统上的文件的路径。 |
slotLabel |
用于标识硬件模块的槽标签。 |
必须符合 PKCS # 11 标签规范。 |
slotUserPin |
用于对模块的 Greengrass 核心进行身份验证的用户 PIN。 |
必须具有足够的权限才能使用配置的私有密钥执行 C_Sign。 |
principals |
||
IoTCertificate |
核心用于向 AWS IoT发出请求的证书和私有密钥。 | |
IoTCertificate .privateKeyPath
|
核心私有密钥的路径。 |
对于文件系统存储,必须为以下格式的文件 URI: 对于 HSM 存储,必须是指定对象标签的 RFC 7512 PKCS#11 |
IoTCertificate .certificatePath |
核心设备证书的绝对路径。 |
必须为以下格式的文件 URI: |
MQTTServerCertificate |
可选。核心为充当 MQTT 服务器或网关而将其证书结合使用的私有密钥。 |
|
MQTTServerCertificate .privateKeyPath |
本地 MQTT 服务器私有密钥的路径。 |
使用此值为本地 MQTT 服务器指定您自己的私有密钥。 对于文件系统存储,必须为以下格式的文件 URI: 对于 HSM 存储,必须是指定对象标签的 RFC 7512 PKCS#11 如果省略此属性,则根据您的 AWS IoT Greengrass 旋转设置旋转密钥。如果指定,客户将负责对密钥进行轮换。 |
SecretsManager |
保护用于加密的数据密钥的私有密钥。有关更多信息,请参阅 将机密部署到核 AWS IoT Greengrass 心。 | |
SecretsManager .privateKeyPath |
本地 Secrets Manager 私有密钥的路径。 |
仅支持 RSA 密钥。 对于文件系统存储,必须为以下格式的文件 URI: 对于 HSM 存储,必须是指定对象标签的 RFC 7512 PKCS#11 |
字段 | 描述 | 备注 |
---|---|---|
caPath |
AWS IoT 根 CA 的绝对路径。 |
必须为以下格式的文件 URI: 注意确保您的终端节点与证书类型对应。 |
PKCS11 |
||
OpenSSLEngine |
可选。OpenSSL 引擎 |
必须是文件系统上的文件的路径。 如果您使用 Greengrass OTA 更新代理来实现硬件安全性,则此属性是必需的。有关更多信息,请参阅 配置对 over-the-air更新的支持。 |
P11Provider |
PKCS#11 实施的 libdl-loadable 库的绝对路径。 |
必须是文件系统上的文件的路径。 |
slotLabel |
用于标识硬件模块的槽标签。 |
必须符合 PKCS # 11 标签规范。 |
slotUserPin |
用于对模块的 Greengrass 核心进行身份验证的用户 PIN。 |
必须具有足够的权限才能使用配置的私有密钥执行 C_Sign。 |
principals |
||
IoTCertificate |
核心用于向 AWS IoT发出请求的证书和私有密钥。 | |
IoTCertificate .privateKeyPath
|
核心私有密钥的路径。 |
对于文件系统存储,必须为以下格式的文件 URI: 对于 HSM 存储,必须是指定对象标签的 RFC 7512 PKCS#11 |
IoTCertificate .certificatePath |
核心设备证书的绝对路径。 |
必须为以下格式的文件 URI: |
MQTTServerCertificate |
可选。核心为充当 MQTT 服务器或网关而将其证书结合使用的私有密钥。 |
|
MQTTServerCertificate .privateKeyPath |
本地 MQTT 服务器私有密钥的路径。 |
使用此值为本地 MQTT 服务器指定您自己的私有密钥。 对于文件系统存储,必须为以下格式的文件 URI: 对于 HSM 存储,必须是指定对象标签的 RFC 7512 PKCS#11 如果省略此属性,则根据您的 AWS IoT Greengrass 旋转设置旋转密钥。如果指定,客户将负责对密钥进行轮换。 |
SecretsManager |
保护用于加密的数据密钥的私有密钥。有关更多信息,请参阅 将机密部署到核 AWS IoT Greengrass 心。 | |
SecretsManager .privateKeyPath |
本地 Secrets Manager 私有密钥的路径。 |
仅支持 RSA 密钥。 对于文件系统存储,必须为以下格式的文件 URI: 对于 HSM 存储,必须是指定对象标签的 RFC 7512 PKCS#11 |
字段 | 描述 | 备注 |
---|---|---|
caPath |
AWS IoT 根 CA 的绝对路径。 |
必须为以下格式的文件 URI: 注意确保您的终端节点与证书类型对应。 |
PKCS11 |
||
OpenSSLEngine |
可选。OpenSSL 引擎 |
必须是文件系统上的文件的路径。 如果您使用 Greengrass OTA 更新代理来实现硬件安全性,则此属性是必需的。有关更多信息,请参阅 配置对 over-the-air更新的支持。 |
P11Provider |
PKCS#11 实施的 libdl-loadable 库的绝对路径。 |
必须是文件系统上的文件的路径。 |
slotLabel |
用于标识硬件模块的槽标签。 |
必须符合 PKCS # 11 标签规范。 |
slotUserPin |
用于对模块的 Greengrass 核心进行身份验证的用户 PIN。 |
必须具有足够的权限才能使用配置的私有密钥执行 C_Sign。 |
principals |
||
IoTCertificate |
核心用于向 AWS IoT发出请求的证书和私有密钥。 | |
IoTCertificate .privateKeyPath
|
核心私有密钥的路径。 |
对于文件系统存储,必须为以下格式的文件 URI: 对于 HSM 存储,必须是指定对象标签的 RFC 7512 PKCS#11 |
IoTCertificate .certificatePath |
核心设备证书的绝对路径。 |
必须为以下格式的文件 URI: |
MQTTServerCertificate |
可选。核心为充当 MQTT 服务器或网关而将其证书结合使用的私有密钥。 |
|
MQTTServerCertificate .privateKeyPath |
本地 MQTT 服务器私有密钥的路径。 |
使用此值为本地 MQTT 服务器指定您自己的私有密钥。 对于文件系统存储,必须为以下格式的文件 URI: 对于 HSM 存储,必须是指定对象标签的 RFC 7512 PKCS#11 如果省略此属性,则根据您的 AWS IoT Greengrass 旋转设置旋转密钥。如果指定,客户将负责对密钥进行轮换。 |
SecretsManager |
保护用于加密的数据密钥的私有密钥。有关更多信息,请参阅 将机密部署到核 AWS IoT Greengrass 心。 | |
SecretsManager .privateKeyPath |
本地 Secrets Manager 私有密钥的路径。 |
仅支持 RSA 密钥。 对于文件系统存储,必须为以下格式的文件 URI: 对于 HSM 存储,必须是指定对象标签的 RFC 7512 PKCS#11 |
AWS IoT Greengrass 硬件安全的配置实践
以下是安全性和性能相关的预配置实践。
- 安全性
-
-
使用内部硬件随机数字生成器直接在 HSM 上生成私有密钥。
注意
如果您配置私钥以使用此功能(按照硬件供应商提供的说明进行操作),请注意 AWS IoT Greengrass 目前仅支持 PKCS1 v1.5 填充机制来加密和解密本地机密。 AWS IoT Greengrass 不支持最佳非对称加密填充 (OAEP)。
-
配置私有密钥以禁止导出。
-
使用硬件供应商提供的配置工具,使用受硬件保护的私钥生成证书签名请求 (CSR),然后使用 AWS IoT 控制台生成客户端证书。
注意
在 HSM 上生成私有密钥时,轮换密钥的做法并不适用。
-
- 性能
-
下图显示了 AWS IoT Greengrass 核心上的 IoT 客户端组件和本地 MQTT 服务器。如果您要为这两个组件使用 HSM 配置,可以使用相同的私有密钥或单独的私有密钥。如果您使用单独的密钥,则它们必须存储在相同的插槽中。
注意
AWS IoT Greengrass 不会对存储在 HSM 上的密钥数量施加任何限制,因此您可以存储物联网客户端、MQTT 服务器和机密管理器组件的私钥。但是,某些 HSM 供应商可能会对您可以存储在插槽中的密钥数量施加限制。
通常,物联网客户端密钥的使用频率不高,因为 AWS IoT Greengrass 核心软件与云保持着长期的连接。但是,每当 Greengrass 设备连接到核心时,都会使用 MQTT 服务器密钥。这些交互直接影响着性能。
当 MQTT 服务器密钥存储在 HSM 中时,设备连接的速度取决于 HSM 每秒能够执行的 RSA 签名操作数量。例如,如果 HSM 需要 300 毫秒在 RSA-2048 私钥上执行 RSASS PKCS1 A--v1.5 签名,则每秒只有三台设备可以连接到 Greengrass 内核。连接完成后,将不再使用 HSM,并且会应用标准 AWS IoT Greengrass配额。
为了消除性能瓶颈,您可以将 MQTT 服务器的私有密钥存储在文件系统上,而不是 HSM 上。通过这种配置,MQTT 服务器的行为就好像未启用硬件安全性一样。
AWS IoT Greengrass 支持 IoT 客户端和 MQTT 服务器组件的多种密钥存储配置,因此您可以根据自己的安全和性能要求进行优化。下表包含一些示例配置。
配置 IoT 密钥 MQTT 密钥 性能 HSM 共享密钥 HSM:密钥 A HSM:密钥 A 受 HSM 或 CPU 限制 HSM 单独密钥 HSM:密钥 A HSM:密钥 B 受 HSM 或 CPU 限制 仅限适用于 IoT 的 HSM HSM:密钥 A 文件系统:密钥 B 受 CPU 限制 传统 文件系统:密钥 A 文件系统:密钥 B 受 CPU 限制 要将 Greengrass 核心配置为在 MQTT 服务器上使用基于文件系统的密钥,请省略
principals.MQTTServerCertificate
该部分(如果您不使用生config.json
成的默认密钥,则指定密钥的基于文件的路径)。 AWS IoT Greengrass生成的crypto
对象如下所示:"crypto": { "PKCS11": { "OpenSSLEngine": "...", "P11Provider": "...", "slotLabel": "...", "slotUserPin": "..." }, "principals": { "IoTCertificate": { "privateKeyPath": "...", "certificatePath": "..." }, "SecretsManager": { "privateKeyPath": "..." } }, "caPath" : "..." }
硬件安全性集成支持的密码套件
AWS IoT Greengrass 当内核配置为硬件安全时,支持一组密码套件。这是在配置核心以使用基于文件的安全性时所支持的密码套件的一部分。有关更多信息,请参阅 TLS 密码套件支持。
注意
当通过本地网络从 Greengrass 设备连接到 Greengrass 核心时,请确保使用一个受支持的加密套件来建立 TLS 连接。
配置对 over-the-air更新的支持
要在使用硬件安全时启用 C AWS IoT Greengrass ore 软件的 over-the-air (OTA) 更新,必须安装 OpenSC libp11 P KCS #11 包装器库并
停止 Greengrass 守护程序。
cd /
greengrass-root
/ggc/core/ sudo ./greengrassd stop注意
greengrass-root
表示 C AWS IoT Greengrass ore 软件在您的设备上的安装路径。通常,这是/greengrass
目录。安装 OpenSSL 引擎。支持 OpenSSL 1.0 或 1.1。
sudo apt-get install libengine-pkcs11-openssl
在您的系统上找到 OpenSSL 引擎的路径 (
libpkcs11.so
):获取库的已安装程序包的列表。
sudo dpkg -L libengine-pkcs11-openssl
libpkcs11.so
文件位于engines
目录中。复制文件的完整路径(例如
/usr/lib/ssl/engines/libpkcs11.so
)。
打开 Greengrass 配置文件。这是位于
/
目录中的 config.json 文件。greengrass-root
/config-
对于
OpenSSLEngine
属性,输入libpkcs11.so
文件的路径。{ "crypto": { "caPath" : "file:///
path-to-root-ca
", "PKCS11" : { "OpenSSLEngine" : "/path-to-p11-openssl-engine
", "P11Provider" : "/path-to-pkcs11-provider-so
", "slotLabel" : "crypto-token-name
", "slotUserPin" : "crypto-token-user-pin
" }, ... } ... }注意
如果
PKCS11
对象中不存在OpenSSLEngine
属性,请进行添加。 启动 Greengrass 守护程序。
cd /
greengrass-root
/ggc/core/ sudo ./greengrassd start
向后兼容早期版本的 AWS IoT Greengrass 核心软件
支持硬件安全的 AWS IoT Greengrass Core 软件与为 v1.6 及更早版本生成的config.json
文件完全向后兼容。如果config.json
配置文件中不存在该crypto
对象,则 AWS IoT Greengrass 使用基于文件的coreThing.certPath
coreThing.keyPath
、和coreThing.caPath
属性。此向后兼容性应用于 Greengrass OTA 更新,这不会覆盖 config.json
中指定的基于文件的配置。
不具有 PKCS#11 支持的硬件
PKCS#11 库通常由硬件供应商提供或是开源软件。例如,使用符合标准的硬件(例如 TPM1 .2),可能可以使用现有的开源软件。但是,如果您的硬件没有相应的 PKCS #11 库实现,或者您想编写自定义 PKCS #11 提供程序,则应联系您的 Enterprise Su AWS pport 代表以解决与集成相关的问题。
另请参阅
-
PKCS #11 加密令牌接口使用指南 2.40 版本。编辑者:John Leiseboer 和 Robert Griffin。2014 年 11 月 16 日。OASIS 委员会备注 02。 http://docs.oasis-open。 org/pkcs11/pkcs11-ug/v2.40/cn02/pkcs11-ug-v2.40-cn02.h
tml。最新版本:http://docs.oasis-open。 org/pkcs11/pkcs11-ug/v2.40/pkcs11-ug-v2.40.h tml。