AWS IoT Greengrass
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

硬件安全性集成

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

AWS IoT Greengrass 支持通过 PKCS#11 接口使用硬件安全模块 (HSM),以实现安全存储和私有密钥分载。这样可防止密钥在软件中暴露或重复。私有密钥可以安全地存储在硬件模块中,如 HSM、受信任平台模块 (TPM) 或其他加密元素。

AWS 合作伙伴设备目录中搜索符合此功能的条件的设备。

下图显示了 AWS IoT Greengrass Core 的硬件安全架构。

在标准安装中,AWS IoT Greengrass 使用两个私有密钥。一个密钥在 Greengrass 核心连接到 AWS IoT 时由 AWS IoT 客户端组件在传输层安全性 (TLS) 握手过程中使用。(此密钥也称为核心私有密钥。) 另一个密钥由本地 MQTT 服务器使用,它使 Greengrass 设备能够与 Greengrass 核心进行通信。如果您要为这两个组件使用硬件安全性,可以使用共享私有密钥或单独的私有密钥。有关更多信息,请参阅AWS IoT Greengrass 硬件安全性的预配置实践

注意

对于标准安装,本地密钥管理器还对其加密过程使用 IoT 客户端密钥,但您可以使用您自己的私有密钥。它必须是最小长度为 2048 位的 RSA 密钥。有关更多信息,请参阅 指定用于密钥加密的私有密钥

要求

在为 Greengrass 核心配置硬件安全性之前,您必须具备以下对象:

  • 一个硬件安全模块 (HSM),可支持您的用于 IoT 客户端、本地 MQTT 服务器和本地密钥管理器组件的目标私有密钥配置。该配置可以包含一个、两个或三个基于硬件的私有密钥,具体取决于您是否配置组件共享密钥。有关私有密钥支持的更多信息,请参阅 AWS IoT Greengrass 核心安全委托人

    • 对于 RSA 密钥:RSA-2048 密钥大小(或更大)和 PKCS # 1 1.5 版本签名方案。

    • 对于 EC 密钥:NIST P-256 或 NIST P-384 曲线。

    注意

    AWS 合作伙伴设备目录中搜索符合此功能的条件的设备。

  • 一个 PKCS#11 提供程序库,可在运行时加载(使用 libdl)并提供 PKCS#11 函数。

  • 硬件模块必须可按槽标签解析,如 PKCS#11 规范所定义。

  • 私有密钥必须使用供应商提供的预配置工具在 HSM 上生成和加载。

  • 私有密钥必须由对象标签来解析。

  • 核心设备证书。这是与私有密钥对应的 AWS IoT 客户端证书。

  • 如果使用的是 Greengrass OTA 更新代理,则必须安装 OpenSSL libp11 PKCS#11 包装程序库。有关更多信息,请参阅无线更新的配置支持

此外,确保满足以下条件:

  • 与私有密钥关联的 IoT 客户端证书在 AWS IoT 中注册并激活。您可以在 AWS IoT 控制台中通过核心事物的 Manage (管理) 页面对此进行验证。

  • 在核心设备上安装 AWS IoT Greengrass 核心软件 1.7 or later 版本,如入门教程中的模块 2 中所述。对 MQTT 服务器使用 EC 密钥需要 1.9 版本。

  • 将证书附加到 Greengrass 核心。您可以在 AWS IoT 控制台中通过核心事物的 Manage (管理) 页面对此进行验证。

注意

目前,AWS IoT Greengrass 不支持直接从 HSM 加载 CA 证书或 AWS IoT 客户端证书。证书必须以纯文本文件形式加载到文件系统中 Greengrass 可读取的位置。

AWS IoT Greengrass 核心的硬件安全性配置

硬件安全性在 Greengrass 配置文件中进行配置。这是 config.json 文件(位于 /greengrass-root/config 目录中)。

注意

要演练使用纯软件实施来设置 HSM 配置的过程,请参阅 模块 7:模拟硬件安全集成

重要

示例中的模拟配置不提供任何安全优势。它只是让您了解 PKCS#11 规范,并在将来计划使用基于硬件的 HSM 时对软件进行初始测试。

要在 AWS IoT Greengrass 中配置硬件安全性,您需在 config.json 中编辑 crypto 对象。

使用硬件安全性时,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:file:///absolute/path/to/file

注意

确保您的终端节点与证书类型对应

PKCS11
OpenSSLEngine

可选。OpenSSL 引擎 .so 文件(用于在 OpenSSL 上启用 PKCS # 11 支持)的绝对路径。

必须是文件系统上的文件的路径。

如果您使用 Greengrass OTA 更新代理来实现硬件安全性,则此属性是必需的。有关更多信息,请参阅无线更新的配置支持

P11Provider

PKCS#11 实施的 libdl-loadable 库的绝对路径。

必须是文件系统上的文件的路径。

slotLabel

用于标识硬件模块的槽标签。

必须符合 PKCS # 11 标签规范。

slotUserPin

用于对模块的 Greengrass 核心进行身份验证的用户 PIN。

必须具有足够的权限才能使用配置的私有密钥执行 C_Sign。

principals
IoTCertificate 核心用于向 AWS IoT 发出请求的证书和私有密钥。
IoTCertificate  .privateKeyPath

核心私有密钥的路径。

对于文件系统存储,必须为以下格式的文件 URI:file:///absolute/path/to/file

对于 HSM 存储,必须是指定对象标签的 RFC 7512 PKCS#11 路径。

IoTCertificate  .certificatePath

核心设备证书的绝对路径。

必须为以下格式的文件 URI:file:///absolute/path/to/file

MQTTServerCertificate

可选。核心为充当 MQTT 服务器或网关而将其证书结合使用的私有密钥。

MQTTServerCertificate  .privateKeyPath

本地 MQTT 服务器私有密钥的路径。

使用此值为本地 MQTT 服务器指定您自己的私有密钥。

对于文件系统存储,必须为以下格式的文件 URI:file:///absolute/path/to/file

对于 HSM 存储,必须是指定对象标签的 RFC 7512 PKCS#11 路径。

如果忽略此属性,AWS IoT Greengrass 会根据轮换设置对密钥进行轮换。如果指定,客户将负责对密钥进行轮换。

SecretsManager 保护用于加密的数据密钥的私有密钥。有关更多信息,请参阅将密钥部署到 AWS IoT Greengrass 核心
SecretsManager  .privateKeyPath

本地 Secrets Manager 私有密钥的路径。

仅支持 RSA 密钥。

对于文件系统存储,必须为以下格式的文件 URI:file:///absolute/path/to/file

对于 HSM 存储,必须是指定对象标签的 RFC 7512 PKCS#11 路径。必须使用 PKCS#1 v1.5 填充机制生成私有密钥。

AWS IoT Greengrass 硬件安全性的预配置实践

以下是安全性和性能相关的预配置实践。

安全性
  • 使用内部硬件随机数字生成器直接在 HSM 上生成私有密钥。

    注意

    在配置要与此功能一起使用的私有密钥(按照硬件供应商提供的说明操作)时,请注意 AWS IoT Greengrass 目前只支持使用 PKCS1 v1.5 填充机制进行本地密钥加密和解密。AWS IoT Greengrass 不支持最优非对称加密填充 (OAEP)。

  • 配置私有密钥以禁止导出。

  • 使用硬件供应商提供的预配置工具,通过硬件保护的私有密钥生成证书签名请求 (CSR),然后使用 AWS IoT 控制台生成客户端证书。

注意

在 HSM 上生成私有密钥时,轮换密钥的做法并不适用。

性能

下图显示了 AWS IoT Greengrass Core 上的 AWS IoT 客户端组件和本地 MQTT 服务器。如果您要为这两个组件使用 HSM 配置,可以使用相同的私有密钥或单独的私有密钥。如果您使用单独的密钥,则它们必须存储在相同的插槽中。

注意

AWS IoT Greengrass 不对您存储在 HSM 上的密钥数量施加任何限制,因此,您可以存储用于 IoT 客户端、MQTT 服务器和密钥管理器组件的私有密钥。但是,某些 HSM 供应商可能会对您可以存储在插槽中的密钥数量施加限制。

一般来说,IoT 客户端密钥使用的频率并不高,因为 AWS IoT Greengrass 核心软件维护与云的长期连接。但是,每当 Greengrass 设备连接到核心时,都会使用 MQTT 服务器密钥。这些交互直接影响着性能。

当 MQTT 服务器密钥存储在 HSM 中时,设备连接的速度取决于 HSM 每秒能够执行的 RSA 签名操作数量。例如,如果 HSM 针对 RSA-2048 私有密钥执行 RSASSA-PKCS1-v1.5 签名需要 300 毫秒,则每秒只有三台设备可以连接到 Greengrass 核心。连接完成后,将不再使用 HSM,并且会应用标准 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 服务器使用基于文件系统的密钥,请省略 config.json 中的 principals.MQTTServerCertificate 部分(或在您不使用 AWS IoT Greengrass 生成的默认密钥时为密钥指定基于文件的路径)。生成的 crypto 对象如下所示:

"crypto": { "PKCS11": { "OpenSSLEngine": "...", "P11Provider": "...", "slotLabel": "...", "slotUserPin": "..." }, "principals": { "IoTCertificate": { "privateKeyPath": "...", "certificatePath": "..." }, "SecretsManager": { "privateKeyPath": "..." } }, "caPath" : "..." }

硬件安全性集成支持的密码套件

在对核心进行硬件安全配置时,AWS IoT Greengrass 支持一组密码套件。这是在配置核心以使用基于文件的安全性时所支持的密码套件的一部分。有关更多信息,请参阅 AWS IoT Greengrass 密码套件

注意

当通过本地网络从 Greengrass 设备连接到 Greengrass 核心时,请确保使用一个受支持的加密套件来建立 TLS 连接。

无线更新的配置支持

要在使用硬件安全性时启用 AWS IoT Greengrass 核心软件的无线 (OTA) 更新,您必须安装 OpenSC libp11 PKCS#11 包装程序库并编辑 Greengrass 配置文件。有关 OTA 更新的更多信息,请参阅 AWS IoT Greengrass 核心软件的 OTA 更新

  1. 停止 AWS Greengrass 守护程序。

    cd /greengrass-root/ggc/core/ sudo ./greengrassd stop

    注意

    greengrass-root 表示在您的设备上安装 AWS IoT Greengrass 核心软件的路径。如果您已按照入门教程中的步骤安装此软件,则安装位置为 /greengrass 目录。

  2. 安装 OpenSSL 引擎。

    sudo apt-get install libengine-pkcs11-openssl
  3. 在您的系统上找到 OpenSSL 引擎的路径 (libpkcs11.so):

    1. 获取库的已安装程序包的列表。

      sudo dpkg -L libengine-pkcs11-openssl

      libpkcs11.so 文件位于 engines 目录中。

    2. 复制文件的完整路径(例如 /usr/lib/ssl/engines/libpkcs11.so)。

  4. 打开 Greengrass 配置文件。这是 /greengrass-root/config 目录中的 config.json 文件。

  5. 对于 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 属性,请进行添加。

  6. 启动 AWS Greengrass 守护程序。

    cd /greengrass-root/ggc/core/ sudo ./greengrassd start

与 AWS IoT Greengrass 核心软件较早版本的向后兼容性

具有硬件安全性支持的 AWS IoT Greengrass 核心软件完全与为 1.6 和较旧版本生成的 config.json 文件向后兼容。如果 config.json 配置文件中不存在 crypto 对象,则 AWS IoT Greengrass 将使用基于文件的 coreThing.certPathcoreThing.keyPathcoreThing.caPath 属性。此向后兼容性应用于 Greengrass OTA 更新,这不会覆盖 config.json 中指定的基于文件的配置。

不具有 PKCS#11 支持的硬件

PKCS#11 库通常由硬件供应商提供或是开源软件。例如,对于符合标准的硬件(如 TPM1.2),可能会使用现有的开源软件。但是,如果您的硬件没有相应的 PKCS#11 库实施,或如果您想要编写自定义 PKCS#11 提供程序,则应联系您的 AWS 企业支持代表,咨询与集成相关的问题。

另请参阅