硬件安全性集成 - Amazon IoT Greengrass
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Amazon IoT Greengrass Version 1 2023 年 6 月 30 日进入延长寿命阶段。有关更多信息,请参阅 Amazon IoT Greengrass V1 维护策略。在此日期之后,将 Amazon IoT Greengrass V1 不会发布提供功能、增强功能、错误修复或安全补丁的更新。在上面运行的设备 Amazon IoT Greengrass V1 不会中断,将继续运行并连接到云端。我们强烈建议您迁移到 Amazon IoT Greengrass Version 2,这样可以添加重要的新功能支持其他平台

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

硬件安全性集成

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

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

Amazon Partner设备目录中搜索符合此功能条件的设备。

下图显示了 Amazon IoT Greengrass 核心的硬件安全架构。

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

注意

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

要求

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

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

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

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

    注意

    Amazon Partner设备目录中搜索符合此功能条件的设备。

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

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

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

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

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

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

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

  • 与私有密钥关联的 IoT 客户端证书在 Amazon IoT 中注册并激活。您可以在Amazon IoT控制台的管理下进行验证,展开所有设备,选择事物,然后为核心内容选择证书选项卡。

  • 在核心设备上安装 Amazon IoT Greengrass 核心软件 v1.7 或更高版本,如“入门”教程中的模块 2 所述。对 MQTT 服务器使用 EC 密钥需要 1.9 或更高版本。

  • 将证书附加到 Greengrass 核心。您可以从 Amazon IoT 控制台的核心内容的管理页面进行验证。

注意

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

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

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

注意

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

重要

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

要在 Amazon 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 对象包含以下属性:

Field 描述 注意
caPath

Amazon 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 The certificate and private key that the core uses to make requests to Amazon 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 路径。

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

SecretsManager The private key that secures the data key used for encryption. For more information, see 将密钥部署到 Amazon IoT Greengrass 核心.
SecretsManager  .privateKeyPath

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

仅支持 RSA 密钥。

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

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

Field 描述 注意
caPath

Amazon 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 The certificate and private key that the core uses to make requests to Amazon 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 路径。

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

SecretsManager The private key that secures the data key used for encryption. For more information, see 将密钥部署到 Amazon IoT Greengrass 核心.
SecretsManager  .privateKeyPath

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

仅支持 RSA 密钥。

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

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

Field 描述 注意
caPath

Amazon 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 The certificate and private key that the core uses to make requests to Amazon 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 路径。

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

SecretsManager The private key that secures the data key used for encryption. For more information, see 将密钥部署到 Amazon IoT Greengrass 核心.
SecretsManager  .privateKeyPath

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

仅支持 RSA 密钥。

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

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

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

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

安全性

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

    注意

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

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

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

注意

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

性能

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

注意

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

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

当 MQTT 服务器密钥存储在 HSM 中时,设备连接的速度取决于 HSM 每秒能够执行的 RSA 签名操作数量。例如,如果 HSM 针对 RSA-2048 私有密钥执行 RSASSA-PKCS1-v1.5 签名需要 300 毫秒,则每秒只有三台设备可以连接到 Greengrass 核心。连接完成后,将不再使用 HSM,并且会应用标准 Amazon IoT Greengrass 配额

为了消除性能瓶颈,您可以将 MQTT 服务器的私有密钥存储在文件系统上,而不是 HSM 上。通过这种配置,MQTT 服务器的行为就好像未启用硬件安全性一样。

Amazon 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 部分(或在您不使用 Amazon IoT Greengrass 生成的默认密钥时为密钥指定基于文件的路径)。生成的 crypto 对象如下所示:

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

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

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

注意

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

配置对无线更新的支持

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

  1. 停止 Greengrass 守护程序。

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

    greengrass-root 表示在您的设备上安装 Amazon IoT Greengrass 核心软件的路径。通常,这是 /greengrass 目录。

  2. 安装 OpenSSL 引擎。支持 OpenSSL 1.0 或 1.1。

    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. 启动 Greengrass 守护程序。

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

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

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

不具有 PKCS#11 支持的硬件

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

另请参阅