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 及更高版本。
此高级模块向您展示如何配置模拟硬件安全模块 (HSM) 以便与 Greengrass 核心一起使用。该配置使用 SoftHSM,这是一个使用 PKCS#11 应用程序编程接口 (API) 的纯软件实现。此模块的目的是允许您设置一个环境,您可以在其中学习 PKCS#11 API 的纯软件实现并针对其进行初始测试。它仅用于学习和初始测试,不适用于任何类型的生产用途。
您可以通过此配置尝试使用与 PKCS#11 兼容的服务来存储您的私有密钥。有关纯软件实施的更多信息,请参阅 SoftHSM
重要
此模块仅用于实验目的。我们强烈建议不要在生产环境中使用 SoftHSM,因为它可能产生一种安全性得到增强的错觉。实际上,生成的配置不具备任何实际安全性优势。存储在 SoftHSM 中的密钥并不比 Greengrass 环境中任何其他密钥存储方式更加安全。
本模块的目的是让您了解 PKCS#11 规范,并在将来计划使用基于硬件的实际 HSM 时对软件进行初始测试。
在用于生产用途之前,您必须单独全面地测试未来的硬件实现,因为 SoftHSM 中提供的 PKCS#11 实现与基于硬件的实现之间可能存在差异。
如果您在启动支持的硬件安全模块方面需要帮助,请联系您的 En AWS terprise Support 代表。
在开始之前,请运行 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 。 注意
如果您在系统上使用此命令时遇到问题,请参阅上的 softhSM 版本 2
。 GitHub该网站提供了更多安装信息,包括如何从源代码构建。
配置 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" } }注意
要使用具有硬件安全性的 over-the-air (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.h
tml。最新版本:http://docs.oasis-open。 org/pkcs11/pkcs11-ug/v2.40/pkcs11-ug-v2.40.h tml。