硬件安全性集成
注意
Greengrass Nucleus 组件的 v2.5.3 及更高版本中提供了此功能。AWS IoT Greengrass 目前不支持在 Windows 核心设备上使用此功能。
您可以通过 PKCS#11 接口
AWS IoT Greengrass Core 软件使用私有密钥和 X.509 证书来对 AWS IoT 和 AWS IoT Greengrass 服务的连接进行身份验证。密钥管理器组件使用此私有密钥来安全加密和解密您部署到 Greengrass 核心设备的密钥。将核心设备配置为使用 HSM 时,这些组件将使用您存储在 HSM 中的私有密钥和证书。
Moquette MQTT 代理组件还会存储其本地 MQTT 服务器证书的私有密钥。此组件将设备文件系统上的私有密钥存储在组件的工作文件夹中。目前,AWS IoT Greengrass 不支持将此私有密钥或证书存储在 HSM 中。
提示
在 AWS 合作伙伴设备目录
要求
您必须满足以下要求才能在 Greengrass 核心设备上使用 HSM:
-
核心设备上安装了 Greengrass Nucleus v2.5.3 或更高版本。在核心设备上安装 AWS IoT Greengrass Core 软件时,可以选择兼容版本。
-
核心设备上安装了 PKCS#11 提供程序组件。在核心设备上安装 AWS IoT Greengrass Core 软件时,可以下载并安装此组件。
-
支持 PKCS#1 v1.5
签名方案和 RSA-2048 密钥大小(或更大)的 RSA 密钥或 ECC 密钥的硬件安全模块。 注意
要使用带 ECC 密钥的硬件安全模块,必须使用 Greengrass Nucleus v2.5.6 或更高版本。
要使用硬件安全模块和密钥管理器,必须使用带 RSA 密钥的硬件安全模块。
-
AWS IoT Greengrass Core 软件可以在运行时加载(使用 libdl)以调用 PKCS#11 函数的 PKCS#11 提供程序库。PKCS#11 提供程序库必须实施以下 PKCS#11 API 操作:
-
C_Initialize
-
C_Finalize
-
C_GetSlotList
-
C_GetSlotInfo
-
C_GetTokenInfo
-
C_OpenSession
-
C_GetSessionInfo
-
C_CloseSession
-
C_Login
-
C_Logout
-
C_GetAttributeValue
-
C_FindObjectsInit
-
C_FindObjects
-
C_FindObjectsFinal
-
C_DecryptInit
-
C_Decrypt
-
C_DecryptUpdate
-
C_DecryptFinal
-
C_SignInit
-
C_Sign
-
C_SignUpdate
-
C_SignFinal
-
C_GetMechanismList
-
C_GetMechanismInfo
-
C_GetInfo
-
C_GetFunctionList
-
-
硬件模块必须可按槽标签解析,如 PKCS#11 规范所定义。
-
如果 HSM 支持对象 ID,则必须将私有密钥和证书存储在同一槽中的 HSM 中,并且它们必须使用相同的对象标签和对象 ID。
-
证书和私有密钥必须由对象标签来解析。
-
私有密钥必须具有以下权限:
-
sign
-
decrypt
-
-
(可选)要使用密钥管理器组件,必须使用 2.1.0 或更高版本,并且私有密钥必须具有以下权限:
-
unwrap
-
wrap
-
硬件安全最佳实践
配置 Greengrass 核心设备硬件安全时,请考虑以下最佳实践。
-
使用内部硬件随机数字生成器直接在 HSM 上生成私有密钥。这种方法比导入您在其他地方生成的私有密钥更加安全,因为私有密钥保留在 HSM 中。
-
将私有密钥配置为不可变并禁止导出。
-
使用 HSM 硬件供应商推荐用于通过硬件保护的私有密钥生成证书签名请求(CSR)的预配置工具,然后使用 AWS IoT 控制台或 API 生成客户端证书。
注意
在 HSM 上生成私有密钥时,轮换密钥的安全最佳实践并不适用。
安装具有硬件安全性的 AWS IoT Greengrass Core 软件
安装 AWS IoT Greengrass Core 软件时,可以将其配置为使用您在 HSM 中生成的私有密钥。这种方法遵循安全最佳实践,在 HSM 中生成私钥,使私钥保留在 HSM 中。
要安装具有硬件安全性的 AWS IoT Greengrass Core 软件,请执行以下操作:
-
在 HSM 中生成私有密钥。
-
通过私有密钥创建证书签名请求(CSR)。
-
通过 CSR 创建证书。您可以创建由 AWS IoT 或其他根证书颁发机构(CA)签名的证书。有关如何使用其他根 CA 的更多信息,请参阅《AWS IoT Core 开发人员指南》中的创建您自己的客户端证书。
-
下载 AWS IoT 证书并将其导入 HSM。
-
通过指定使用 PKCS#11 提供程序组件以及 HSM 中的私有密钥和证书的配置文件安装 AWS IoT Greengrass Core 软件。
安装具有硬件安全性的 AWS IoT Greengrass Core 软件时,您可以选择以下安装选项之一:
-
手动安装
选择此选项可手动创建所需 AWS 资源并配置硬件安全性。有关更多信息,请参阅 通过手动资源预置安装 AWS IoT Greengrass Core 软件。
-
使用自定义预置进行安装
选择此选项可开发自定义 Java 应用程序,该应用程序可自动创建所需 AWS 资源并配置硬件安全性。有关更多信息,请参阅 使用自定义资源预置安装 AWS IoT Greengrass Core 软件。
目前,在通过自动资源预置或 AWS IoT 实例集预置进行安装时,AWS IoT Greengrass 不支持安装具有硬件安全性的 AWS IoT Greengrass 核心软件。
在现有核心设备上配置硬件安全性
您可以将核心设备的私有密钥和证书导入 HSM 以配置硬件安全性。
注意事项
-
您必须拥有对核心设备文件系统的根访问权限。
-
在此过程中,您将关闭 AWS IoT Greengrass Core 软件,因此在配置硬件安全性时,核心设备处于离线状态且不可用。
要在现有核心设备上配置硬件安全性,您需要执行以下操作:
-
初始化 HSM。
-
将 PKCS#11 提供程序组件部署到该核心设备。
-
停止 AWS IoT Greengrass Core 软件。
-
将核心设备的私有密钥和证书导入到 HSM。
-
更新 AWS IoT Greengrass Core 软件的配置文件以使用 HSM 中的私有密钥和证书。
-
启动 AWS IoT Greengrass Core 软件。
第 1 步:初始化硬件安全模块
完成以下步骤,初始化核心设备上的 HSM。
初始化硬件安全模块
-
在 HSM 中初始化 PKCS#11 令牌,然后保存该令牌的槽 ID 和用户 PIN。查看 HSM 的文档,了解如何初始化令牌。稍后在部署和配置 PKCS#11 提供程序组件时,您将用到槽 ID 和用户 PIN。
第 2 步:部署 PKCS#11 提供程序组件
完成以下步骤,部署和配置 PKCS#11 提供程序组件。您可以将组件部署到一台或多台核心设备。
-
在 AWS IoT Greengrass 控制台
导航菜单中,选择组件。 -
在组件页面上,选择公有组件选项卡,然后选择 aws.greengrass.crypto.Pkcs11Provider。
-
在 aws.greengrass.crypto.Pkcs11Provider 页面上,选择部署。
-
从添加到部署中,选择要修改的现有部署,或者选择创建新部署,然后选择下一步。
-
如果您选择创建新部署,请为部署选择目标核心设备或事物组。在指定目标页面的部署目标下面,选择核心设备或事物组,然后选择下一步。
-
在选择组件页面上的公有组件下,选择 aws.greengrass.crypto.Pkcs11Provider,然后选择下一步。
-
在配置组件页面上,选择 aws.greengrass.crypto.Pkcs11Provider,然后执行以下操作:
-
选择配置组件。
-
在配置 aws.greengrass.crypto.Pkcs11Provider 模式的配置更新下要合并的配置中,输入以下配置更新。使用目标核心设备的值更新以下配置参数。指定之前初始化 PKCS#11 令牌的槽 ID 和用户 PIN。稍后您会将私有密钥和证书导入 HSM 的此槽。
name
-
PKCS#11 配置的名称。
library
-
AWS IoT Greengrass Core 软件可以使用 libdl 加载的 PKCS#11 实施库的绝对文件路径。
slot
-
包含私有密钥和设备证书的槽的 ID。此值不同于槽索引或槽标签。
userPin
-
用于访问该槽的用户 PIN。
{ "name": "softhsm_pkcs11", "library": "/usr/lib/softhsm/libsofthsm2.so", "slot": 1, "userPin": "1234" }
-
选择确认以关闭模式,然后选择下一步。
-
-
在配置高级设置页面上,保留默认配置设置,然后选择下一步。
-
在 检查 页上,选择 部署。
完成部署可能最多需要 1 分钟。
要部署 PKCS#11 提供程序组件,请创建 components
对象中包含 aws.greengrass.crypto.Pkcs11Provider
的部署文档,并指定该组件的配置更新。按照 创建部署 中的说明创建新部署或修改现有部署。
以下示例部分部署文档指定部署并配置 PKCS#11 提供程序组件。使用目标核心设备的值更新以下配置参数。保存槽 ID 和用户 PIN,以便稍后在将私有密钥和证书导入 HSM 时使用。
name
-
PKCS#11 配置的名称。
library
-
AWS IoT Greengrass Core 软件可以使用 libdl 加载的 PKCS#11 实施库的绝对文件路径。
slot
-
包含私有密钥和设备证书的槽的 ID。此值不同于槽索引或槽标签。
userPin
-
用于访问该槽的用户 PIN。
{ "name": "softhsm_pkcs11", "library": "/usr/lib/softhsm/libsofthsm2.so", "slot": 1, "userPin": "1234" }
{
...
, "components": {...
, "aws.greengrass.crypto.Pkcs11Provider": { "componentVersion": "2.0.0", "configurationUpdate": { "merge": "{\"name\":\"softhsm_pkcs11\",\"library\":\"/usr/lib/softhsm/libsofthsm2.so\",\"slot\":1,\"userPin\":\"1234\"}" } } } }
完成部署可能需要数分钟。您可以使用 AWS IoT Greengrass 服务来检查部署的状态。您可以查看 AWS IoT Greengrass Core 软件日志,验证 PKCS#11 提供程序组件是否成功部署。有关更多信息,请参阅下列内容:
如果部署失败,可以对每台核心设备上的部署进行问题排查。有关更多信息,请参阅 故障排除 AWS IoT Greengrass V2。
第 3 步:更新核心设备上的配置
AWS IoT Greengrass Core 软件使用指定设备运行方式的配置文件。此配置文件包含可以在哪里找到设备用于连接 AWS Cloud 的私有密钥和证书。完成以下步骤,将核心设备的私有密钥和证书导入 HSM,并更新配置文件以使用 HSM。
更新核心设备上的配置以采用硬件安全性
-
停止 AWS IoT Greengrass Core 软件。如果您使用 systemd 将 AWS IoT Greengrass Core 软件配置为系统服务,可以运行以下命令来停止该软件。
sudo systemctl stop greengrass.service
-
找到核心设备的私有密钥和证书文件。
您也可以在
中查看
/config/effectiveConfig.yaml/greengrass/v2
system.privateKeyPath
和system.certificateFilePath
属性以查找这些文件的位置。 -
将私有密钥和证书导入 HSM。查看 HSM 文档,了解如何导入私有密钥和证书。使用之前初始化 PKCS#11 令牌的槽 ID 和用户 PIN 导入私有密钥和证书。私有密钥和证书必须使用相同的对象标签和对象 ID。保存您在导入每个文件时指定的对象标签。稍后在更新 AWS IoT Greengrass Core 软件配置以使用 HSM 中的私有密钥和证书时将用到此标签。
-
更新 AWS IoT Greengrass Core 软件配置以使用 HSM 中的私有密钥和证书。要更新配置,请修改 AWS IoT Greengrass Core 配置文件,然后使用更新的配置文件运行 AWS IoT Greengrass Core 软件以应用新配置。
执行以下操作:
-
创建 AWS IoT Greengrass Core 配置文件备份。如果您在配置硬件安全性时遇到问题,可以使用此备份来恢复核心设备。
sudo cp
/config/effectiveConfig.yaml ~/ggc-config-backup.yaml/greengrass/v2
-
在文本编辑器中打开 AWS IoT Greengrass Core 配置文件。例如,您可以运行以下命令来使用 GNU nano 编辑文件。将
替换为 Greengrass 根文件夹的路径。/greengrass/v2
sudo nano
/config/effectiveConfig.yaml/greengrass/v2
-
将
system.privateKeyPath
的值替换为 HSM 中私有密钥的 PKCS#11 URI。将iotdevicekey
替换为之前导入私有密钥和证书处的对象标签。pkcs11:object=
iotdevicekey
;type=private -
将
system.certificateFilePath
的值替换为 HSM 中证书的 PKCS#11 URI。将iotdevicekey
替换为之前导入私有密钥和证书处的对象标签。pkcs11:object=
iotdevicekey
;type=cert
完成这些步骤后,AWS IoT Greengrass Core 配置文件中的
system
属性应与以下示例类似。system: certificateFilePath: "pkcs11:object=
iotdevicekey
;type=cert" privateKeyPath: "pkcs11:object=iotdevicekey
;type=private" rootCaPath: "
/rootCA.pem" rootpath: "/greengrass/v2
" thingName: "/greengrass/v2
MyGreengrassCore
" -
-
在更新的
effectiveConfig.yaml
文件中应用配置。使用--init-config
参数运行Greengrass.jar
以在effectiveConfig.yaml
中应用配置。将
替换为 Greengrass 根文件夹的路径。/greengrass/v2
sudo java -Droot="
" \ -jar/greengrass/v2
/alts/current/distro/lib/Greengrass.jar \ --start false \ --init-config/greengrass/v2
/config/effectiveConfig.yaml/greengrass/v2
-
启动 AWS IoT Greengrass Core 软件。如果您使用 systemd 将 AWS IoT Greengrass Core 软件配置为系统服务,可以运行以下命令来启动该软件。
sudo systemctl start greengrass.service
有关更多信息,请参阅 运行 AWS IoT Greengrass Core 软件。
-
查看 AWS IoT Greengrass Core 软件日志,验证软件是否启动并连接到 AWS Cloud。AWS IoT Greengrass Core 软件使用私有密钥和证书来连接 AWS IoT 和 AWS IoT Greengrass 服务。
sudo tail -f
/logs/greengrass.log/greengrass/v2
以下信息级别的日志消息表明 AWS IoT Greengrass Core 软件已成功连接 AWS IoT 和 AWS IoT Greengrass 服务。
2021-12-06T22:47:53.702Z [INFO] (Thread-3) com.aws.greengrass.mqttclient.AwsIotMqttClient: Successfully connected to AWS IoT Core. {clientId=MyGreengrassCore5, sessionPresent=false}
-
(可选)在确认 AWS IoT Greengrass Core 软件可以使用 HSM 中的私有密钥和证书后,从设备文件系统中删除该私有密钥和证书文件。运行以下命令,并将文件路径替换为该私有密钥和证书文件的路径。
sudo rm
sudo rm
/privKey.key/greengrass/v2
/thingCert.crt/greengrass/v2
使用不支持 PKCS#11 的硬件
PKCS#11 库通常由硬件供应商提供或是开源软件。例如,对于符合标准的硬件(如 TPM1.2),可能会使用现有的开源软件。但是,如果您的硬件没有相应的 PKCS#11 库实施,或如果您想要编写自定义 PKCS#11 提供程序,请联系您的 Amazon Web Services 企业支持代表,咨询与集成相关的问题。