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

模块 7:模拟硬件安全集成

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

此高级模块向您展示如何配置模拟硬件安全模块 (HSM) 以便与 Greengrass 核心一起使用。该配置使用 SoftHSM,这是一个使用 PKCS#11 应用程序编程接口 (API) 的纯软件实现。此模块的目的是允许您设置一个环境,您可以在其中学习 PKCS#11 API 的纯软件实现并针对其进行初始测试。它仅用于学习和初始测试,不适用于任何类型的生产用途。

您可以通过此配置尝试使用与 PKCS#11 兼容的服务来存储您的私有密钥。有关纯软件实施的更多信息,请参阅 SoftHSM。有关在 AWS IoT Greengrass Core 上集成硬件安全性的更多信息,包括一般要求,请参阅硬件安全性集成

重要

此模块仅用于实验目的。我们强烈建议不要在生产环境中使用 SoftHSM,因为它可能产生一种安全性得到增强的错觉。实际上,生成的配置不具备任何实际安全性优势。存储在 SoftHSM 中的密钥并不比 Greengrass 环境中任何其他密钥存储方式更加安全。

本模块的目的是让您了解 PKCS#11 规范,并在将来计划使用基于硬件的实际 HSM 时对软件进行初始测试。

在用于生产用途之前,您必须单独全面地测试未来的硬件实现,因为 SoftHSM 中提供的 PKCS#11 实现与基于硬件的实现之间可能存在差异。

如果在使用支持的硬件安全模块方面需要帮助,请联系您的 AWS 企业支持代表。

在开始之前,请确保已完成入门教程的模块 1 模块 2。在本模块中,我们假设您的核心已经配置并与 AWS 通信。本模块应该需要大约 30 分钟才能完成。

安装 SoftHSM 软件

在本步骤中,您将安装 SoftHSM 和 pkcs11 工具,这些工具用于管理您的 SoftHSM 实例。

  • 在 AWS IoT Greengrass Core 设备上的终端中,运行以下命令:

    sudo apt-get install softhsm2 libsofthsm2-dev pkcs11-dump

    有关这些程序包的更多信息,请参阅安装 softhsm2安装 libsofthsm2-dev安装 pkcs11-dump

    注意

    如果在系统上使用此命令时遇到问题,请参阅 GitHub 上的 SoftHSM 版本 2。该网站提供了更多安装信息,包括如何从源代码构建。

配置 SoftHSM

在此步骤中,您将配置 SoftHSM

  1. 切换到根用户。

    sudo su
  2. 使用手册页面查找系统范围的 softhsm2.conf 位置。一个常见位置是 /etc/softhsm/softhsm2.conf,但在某些系统上,位置可能有所不同。

    man softhsm2.conf
  3. 在系统范围的位置中为 softhsm2 配置文件创建目录。在本例中,我们假设位置为 /etc/softhsm/softhsm2.conf

    mkdir -p /etc/softhsm
  4. /greengrass 目录中创建令牌目录。

    注意

    如果跳过此步骤,softhsm2-util 将报告 ERROR: Could not initialize the library

    mkdir -p /greengrass/softhsm2/tokens
  5. 配置令牌目录。

    echo "directories.tokendir = /greengrass/softhsm2/tokens" > /etc/softhsm/softhsm2.conf
  6. 配置基于文件的后端。

    echo "objectstore.backend = file" >> /etc/softhsm/softhsm2.conf

注意

这些配置设置仅用于实验目的。要查看所有配置选项,请打开配置文件的手册页面。

man softhsm2.conf

将私有密钥导入 SoftHSM

在此步骤中,初始化 SoftHSM 令牌,转换私有密钥格式,然后导入私有密钥。

  1. 初始化 SoftHSM 令牌。

    softhsm2-util --init-token --slot 0 --label greengrass --so-pin 12345 --pin 1234

    注意

    如果出现提示,请输入 SO PIN 12345 和用户 PIN 1234。AWS IoT Greengrass 不使用 SO(主管)PIN,因此您可以使用任何值。

  2. 将私有密钥转换成 SoftHSM 导入工具可以使用的格式。在本教程中,您将转换从入门教程的模块 2 中的 Easy Group creation (轻松创建组) 选项中获得的私有密钥。

    openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in hash.private.key -out hash.private.pem
  3. 将私有密钥导入 SoftHSM。只运行以下命令之一,具体取决于您的 softhsm2-util 版本。

    Raspbian softhsm2-util v2.2.0 语法
    softhsm2-util --import hash.private.pem --token greengrass --label iotkey --id 0000 --pin 12340
    Ubuntu softhsm2-util v2.0.0 语法
    softhsm2-util --import hash.private.pem --slot 0 --label iotkey --id 0000 --pin 1234

    此命令将插槽标识为 0,并将键标签定义为 iotkey。您将在下一节中使用这些值。

导入私有密钥后,您可以选择将其从 /greengrass/certs 目录中删除。确保将根 CA 和设备证书保留在目录中。

配置 Greengrass 核心以使用 SoftHSM

在本步骤中,您将修改 Greengrass 核心配置文件以使用 SoftHSM。

  1. 在您的系统上找到 SoftHSM 提供程序库 (libsofthsm2.so) 的路径:

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

      sudo dpkg -L libsofthsm2

      libsofthsm2.so 文件位于 softhsm 目录中。

    2. 复制文件的完整路径(例如 /usr/lib/x86_64-linux-gnu/softhsm/libsofthsm2.so)。您稍后会使用此值。

  2. 停止 AWS Greengrass 守护程序。

    cd /greengrass/ggc/core/ sudo ./greengrassd stop
  3. 打开 Greengrass 配置文件。这是 /greengrass/config 目录中的 config.json 文件。

    注意

    本过程中的示例是基于以下假设编写的:config.json 文件使用从入门教程的模块 2 中的 Easy Group creation (轻松创建组) 选项生成的格式。

  4. crypto.principals 对象中,插入以下 MQTT 服务器证书对象。在需要的位置添加逗号以创建有效的 JSON 文件。

    "MQTTServerCertificate": { "privateKeyPath": "path-to-private-key" }
  5. crypto 对象中,插入以下 PKCS11 对象。在需要的位置添加逗号以创建有效的 JSON 文件。

    "PKCS11": { "P11Provider": "/path-to-pkcs11-provider-so", "slotLabel": "crypto-token-name", "slotUserPin": "crypto-token-user-pin" }

    您的文件应如下所示:

    { "coreThing" : { "caPath" : "root.ca.pem", "certPath" : "hash.cert.pem", "keyPath" : "hash.private.key", "thingArn" : "arn:partition:iot:区域:account-id:thing/core-thing-name", "iotHost" : "host-prefix.iot.区域.amazonaws.com", "ggHost" : "greengrass.iot.区域.amazonaws.com", "keepAlive" : 600 }, "runtime" : { "cgroup" : { "useSystemd" : "yes" } }, "managedRespawn" : false, "crypto": { "PKCS11": { "P11Provider": "/path-to-pkcs11-provider-so", "slotLabel": "crypto-token-name", "slotUserPin": "crypto-token-user-pin" }, "principals" : { "MQTTServerCertificate": { "privateKeyPath": "path-to-private-key" }, "IoTCertificate" : { "privateKeyPath" : "file:///greengrass/certs/hash.private.key", "certificatePath" : "file:///greengrass/certs/hash.cert.pem" }, "SecretsManager" : { "privateKeyPath" : "file:///greengrass/certs/hash.private.key" } }, "caPath" : "file:///greengrass/certs/root.ca.pem" } }

    注意

    要将无线 (OTA) 更新与硬件安全性结合使用,PKCS11 对象还必须包含 OpenSSLEngine 属性。有关更多信息,请参阅无线更新的配置支持

  6. 编辑 crypto 数据:

    1. 配置 PKCS11 对象。

      • 对于 P11Provider,输入 libsofthsm2.so 的完整路径。

      • 对于 slotLabel,输入 greengrass

      • 对于 slotUserPin,输入 1234

    2. principals 对象中配置私有密钥路径。请勿编辑 certificatePath 属性。

      • 对于 privateKeyPath 属性,请输入以下 RFC 7512 PKCS#11 路径(指定键的标签)。对 IoTCertificateSecretsManagerMQTTServerCertificate 委托人执行此操作。

        pkcs11:object=iotkey;type=private
    3. 检查 crypto 对象。如下所示:

      "crypto": { "PKCS11": { "P11Provider": "/usr/lib/x86_64-linux-gnu/softhsm/libsofthsm2.so", "slotLabel": "greengrass", "slotUserPin": "1234" }, "principals": { "MQTTServerCertificate": { "privateKeyPath": "pkcs11:object=iotkey;type=private" }, "SecretsManager": { "privateKeyPath": "pkcs11:object=iotkey;type=private" }, "IoTCertificate": { "certificatePath": "file://certs/core.crt", "privateKeyPath": "pkcs11:object=iotkey;type=private" } }, "caPath": "file://certs/root.ca.pem" }
  7. coreThing 对象中删除 caPathcertPathkeyPath。如下所示:

    "coreThing" : { "thingArn" : "arn:partition:iot:区域:account-id:thing/core-thing-name", "iotHost" : "host-prefix-ats.iot.区域.amazonaws.com", "ggHost" : "greengrass-ats.iot.区域.amazonaws.com", "keepAlive" : 600 }

注意

在本教程中,您将为所有委托人指定相同的私有密钥。有关为本地 MQTT 服务器选择私有密钥的更多信息,请参阅性能。有关本地 Secrets Manager 的更多信息,请参阅将密钥部署到 AWS IoT Greengrass 核心

测试配置

  • 启动 AWS Greengrass 守护程序。

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

    如果守护程序成功启动,则您的核心已正确配置。

    现在已准备就绪,可以了解 PKCS#11 规范并使用 SoftHSM 实现提供的 PKCS#11 API 进行初始测试。

    重要

    重申一遍,必须注意此模块仅用于学习和测试,这一点非常重要。它不会实际改善您的 Greengrass 环境的安全状况。

    该模块的目的是使您能够开始学习和测试,以便为将来使用真正的基于硬件的 HSM 做准备。那时,您必须在开始任何生产用途之前,针对基于硬件的 HSM 单独全面地测试您的软件,因为 SoftHSM 中提供的 PKCS#11 实施与基于硬件的实施之间可能存在差异。

另请参阅