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,这样可以添加重要的新功能并支持其他平台。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
模块 7:模拟硬件安全集成
此功能适用于 AWS IoT Greengrass Core v1.7 及更高版本。
此高级模块向您展示如何配置模拟硬件安全模块 (HSM) 以便与 Greengrass 核心一起使用。该配置使用 SoftHSM,这是一个使用 PKCS#11 应用程序编程接口 (API) 的纯软件实现。此模块的目的是允许您设置一个环境,您可以在其中学习 PKCS#11 API 的纯软件实现并针对其进行初始测试。它仅用于学习和初始测试,不适用于任何类型的生产用途。
您可以通过此配置尝试使用与 PKCS#11 兼容的服务来存储您的私有密钥。有关纯软件实施的更多信息,请参阅 SoftHSM
重要
此模块仅用于实验目的。我们强烈建议不要在生产环境中使用 SoftHSM,因为它可能产生一种安全性得到增强的错觉。实际上,生成的配置不具备任何实际安全性优势。存储在 SoftHSM 中的密钥并不比 Greengrass 环境中任何其他密钥存储方式更加安全。
本模块的目的是让您了解 PKCS#11 规范,并在将来计划使用基于硬件的实际 HSM 时对软件进行初始测试。
在用于生产用途之前,您必须单独全面地测试未来的硬件实现,因为 SoftHSM 中提供的 PKCS#11 实现与基于硬件的实现之间可能存在差异。
如果在使用支持的硬件安全模块方面需要帮助,请联系您的 AWS 企业支持代表。
在开始之前,请运行 Greengrass 设备安装 脚本,或确保您已完成入门教程的模块 1 和模块 2。在本模块中,我们假设您的核心已经配置并与 AWS 通信。本模块应该需要大约 30 分钟才能完成。
安装 SoftHSM 软件
在本步骤中,您将安装 SoftHSM 和 pkcs11 工具,这些工具用于管理您的 SoftHSM 实例。
-
在 AWS IoT Greengrass 核心设备上的终端中,运行以下命令:
sudo apt-get install softhsm2 libsofthsm2-dev pkcs11-dump
有关这些程序包的更多信息,请参阅安装 softhsm2
、安装 libsofthsm2-dev 和安装 pkcs11-dump 。 注意
如果在系统上使用此命令时遇到问题,请参阅 GitHub 上的 SoftHSM 版本 2
。该网站提供了更多安装信息,包括如何从源代码构建。
配置 SoftHSM
在此步骤中,您将配置 SoftHSM
-
切换到根用户。
sudo su
-
使用手册页面查找系统范围的
softhsm2.conf
位置。一个常见位置是/etc/softhsm/softhsm2.conf
,但在某些系统上,位置可能有所不同。man softhsm2.conf
-
在系统范围的位置中为 softhsm2 配置文件创建目录。在本例中,我们假设位置为
/etc/softhsm/softhsm2.conf
。mkdir -p /etc/softhsm
-
在
/greengrass
目录中创建令牌目录。注意
如果跳过此步骤,softhsm2-util 将报告
ERROR: Could not initialize the library
。mkdir -p /greengrass/softhsm2/tokens
-
配置令牌目录。
echo "directories.tokendir = /greengrass/softhsm2/tokens" > /etc/softhsm/softhsm2.conf
-
配置基于文件的后端。
echo "objectstore.backend = file" >> /etc/softhsm/softhsm2.conf
注意
这些配置设置仅用于实验目的。要查看所有配置选项,请打开配置文件的手册页面。
man softhsm2.conf
将私有密钥导入 SoftHSM
在此步骤中,初始化 SoftHSM 令牌,转换私有密钥格式,然后导入私有密钥。
-
初始化 SoftHSM 令牌。
softhsm2-util --init-token --slot 0 --label greengrass --so-pin 12345 --pin 1234
注意
如果出现提示,请输入 SO PIN
12345
和用户 PIN1234
。AWS IoT Greengrass 不使用 SO(主管)PIN,因此您可以使用任何值。如果您收到
CKR_SLOT_ID_INVALID: Slot 0 does not exist
错误,请尝试执行以下命令:softhsm2-util --init-token --free --label greengrass --so-pin 12345 --pin 1234
-
将私有密钥转换成 SoftHSM 导入工具可以使用的格式。在本教程中,您将转换从“入门”教程模块 2 中的默认组创建选项中获得的私钥。
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in
hash
.private.key -outhash
.private.pem -
将私有密钥导入 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。
在您的系统上找到 SoftHSM 提供程序库 (
libsofthsm2.so
) 的路径:获取库的已安装程序包的列表。
sudo dpkg -L libsofthsm2
libsofthsm2.so
文件位于softhsm
目录中。复制文件的完整路径(例如
/usr/lib/x86_64-linux-gnu/softhsm/libsofthsm2.so
)。您稍后会使用此值。
停止 Greengrass 守护程序。
cd /greengrass/ggc/core/ sudo ./greengrassd stop
打开 Greengrass 配置文件。这是位于
/greengrass/config
目录中的 config.json 文件。注意
本过程中的示例假设
config.json
文件使用“入门”教程模块 2 中的默认组创建选项生成的格式。-
在
crypto.principals
对象中,插入以下 MQTT 服务器证书对象。在需要的位置添加逗号以创建有效的 JSON 文件。"MQTTServerCertificate": { "privateKeyPath": "path-to-private-key" }
-
在
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:region
:account-id
:thing/core-thing-name
", "iotHost" : "host-prefix
.iot.region
.amazonaws.com", "ggHost" : "greengrass.iot.region
.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
属性。有关更多信息,请参阅配置对 over-the-air 更新的支持。 -
编辑
crypto
数据:配置
PKCS11
对象。对于
P11Provider
,输入libsofthsm2.so
的完整路径。对于
slotLabel
,输入greengrass
。对于
slotUserPin
,输入1234
。
在
principals
对象中配置私有密钥路径。请勿编辑certificatePath
属性。对于
privateKeyPath
属性,请输入以下 RFC 7512 PKCS#11 路径(指定键的标签)。对IoTCertificate
、SecretsManager
和MQTTServerCertificate
委托人执行此操作。pkcs11:object=iotkey;type=private
-
检查
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" }
-
从
coreThing
对象中删除caPath
、certPath
和keyPath
。如下所示:"coreThing" : { "thingArn" : "arn:
partition
:iot:region
:account-id
:thing/core-thing-name", "iotHost" : "host-prefix
-ats.iot.region
.amazonaws.com", "ggHost" : "greengrass-ats.iot.region
.amazonaws.com", "keepAlive" : 600 }
注意
在本教程中,您将为所有委托人指定相同的私有密钥。有关为本地 MQTT 服务器选择私有密钥的更多信息,请参阅性能。有关本地 Secrets Manager 的更多信息,请参阅将密钥部署到 AWS IoT Greengrass 核心。
测试配置
启动 Greengrass 守护程序。
cd /greengrass/ggc/core/ sudo ./greengrassd start
如果守护程序成功启动,则您的核心已正确配置。
现在已准备就绪,可以了解 PKCS#11 规范并使用 SoftHSM 实现提供的 PKCS#11 API 进行初始测试。
重要
重申一遍,必须注意此模块仅用于学习和测试,这一点非常重要。它不会实际改善您的 Greengrass 环境的安全状况。
该模块的目的是使您能够开始学习和测试,以便为将来使用真正的基于硬件的 HSM 做准备。那时,您必须在开始任何生产用途之前,针对基于硬件的 HSM 单独全面地测试您的软件,因为 SoftHSM 中提供的 PKCS#11 实施与基于硬件的实施之间可能存在差异。
另请参阅
-
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.html
。最新版本:http://docs.oasis-open.org/pkcs11/pkcs11-ug/v2.40/pkcs11-ug-v2.40.html 。