corePKCS11 相互身份验证演示 (MQTT)
注意:我们建议您在任何物联网 (IoT) 应用程序中始终使用强相互身份验证。此示例使用推荐的相互身份验证,适用于生产 IoT。
简介
本演示建立在 MQTT 相互身份验证演示的基础上,假定您已经熟悉了 MQTT 演示系列,如果您不熟悉,请参阅 MQTT 部分。
PKCS #11 演示项目使用 FreeRTOS Windows 移植 ,因此可以在 Windows 上使用 Visual Studio 的社区免费版进行构建和评估,而无需任何特定的 MCU 硬件。
此演示以类似于 MQTT 相互身份验证的方式建立与 AWS (Amazon Web Services) IoT 的连接,但它使用 PKCS #11 来管理与 AWS IoT 建立连接的必要凭据。出于演示目的,此 PKCS #11 实现使用 Windows 文件系统进行凭据管理。
PKCS #11 通过为每个加密对象分配一个人类可读标签起作用。在本演示中,我们将 "Device Priv TLS Key" 标签映射到我们的私钥,
并将 "Device Cert" 映射到我们的证书。这些标签的名称可以在 core_pkcs11_config.h
中进行管理。
在 core_pkcs11_pal_utils.c
中,
我们已将这些标签分别映射到 corePKCS11_Key.dat
和 corePKCS11_Certificate.dat
。
源代码组织
基于 PKCS #11 的双向验证演示的 Visual Studio 解决方案文件名为 corePKCS11_MQTT_Mutual_Auth.sln
,
位于 \FreeRTOS-Plus\Demo\corePKCS11_MQTT_Mutual_Auth_Windows_Simulator\
目录(详见 FreeRTOS 主下载内容)。
点击放大
配置演示项目
按照 MQTT 相互身份验证中的说明配置演示项目,您可以忽略将您的证书和私钥迁移到 democonfig.h
文件的步骤,但请确保 Thing 名称和 AWS IoT 端点包含在 democonfig.h
中。 可以忽略这些步骤,因为您将通过 PKCS #11 接口导入凭据,而不是通过这个演示。
完成此操作后,请按以下步骤操作:
- 在
democonfig.h
中
- 将
democonfigCLIENT_CERTIFICATE_PEM
设置为空字符串。
#define democonfigCLIENT_CERTIFICATE_PEM ""
- 将
democonfigCLIENT_PRIVATE_KEY_PEM
设置为空字符串。
#define democonfigCLIENT_PRIVATE_KEY_PEM ""
- 这是为了防止
\FreeRTOS-Plus\Demo\corePKCS11_MQTT_Mutual_Auth_Windows_Simulator\demo_config.h
生成
编译器错误,并将进一步证明此头文件中的凭据未在演示中的任何地方使用。
- 将使用 AWS IoT 核心进行身份验证的密钥和证书 PEM 文件转换为 DER 格式。
- 您应该已经在 MQTT 演示中获取了 PEM 格式的凭据。如果没有,请重新查看 MQTT 双向验证系列,
以获取有关检索这些凭据的指导。
- 方案 1:使用提供的 python 脚本:
- 转到
\FreeRTOS-Plus\Demo\corePKCS11_MQTT_Mutual_Auth_Windows_Simulator
,将密钥和证书 PEM 文件的绝对路径传递给
pkcs11_demo_setup.py
.
python3 pkcs11_demo_setup.py -c thing_cert_pem_file.pem -k thing_private_key_pem_file.pem
这将在运行脚本的相同位置输出等效的 .dat 文件。
- 方案 2:手动转换 PEM 文件。
- 如果您选择不使用上述脚本,请手动将 PEM 文件转换为 PKCS #11 兼容的 DER 格式。
- 使用 OpenSSL 进行转换的示例:
openssl x509 -outform der -in "<CERTIFICATE_PEM_FILE>" -out corePKCS11_Certificate.dat
openssl pkcs8 -topk8 -inform PEM -outfrom -DER -in "<KEY_PEM_FILE>" -out <PKCS11_RELEVANT_FILE_TYPE>
- 建议对各个连接使用单独的密钥,以将任何单独的密钥可以解锁的范围保持在最低限度。
本演示旨在按照 core_pkcs11_pal_utils.c 中所述的名称加载密钥。
- 将新创建的 .dat 文件移动到与项目解决方案相同的文件夹,本例中为
FreeRTOS-Plus\Demo\corePKCS11_MQTT_Mutual_Auth_Windows_Simulator\corePKCS11_MQTT_Mutual_Auth.sln
。
构建演示项目
本演示项目使用
Visual Studio 社区免费版。
- 打开
FreeRTOS-Plus\Demo\corePKCS11_MQTT_Mutual_Auth_Windows_Simulator\corePKCS11_MQTT_Mutual_Auth.sln
Visual Studio 解决方案文件(通过 Visual Studio IDE 打开)。
- 右键点击该项目并选择“设置为启动项目”
点击放大
- 在 IDE 的 "build" 菜单中选择 "build solution"。
功能
此演示提供与相互身份验证 MQTT 演示相同的功能,并添加了使用 PKCS #11 管理凭据的内容。有关 MQTT 功能的详细信息,请查看 MQTT 演示系列。
此演示与 MQTT 系列之间的主要区别在于
FreeRTOS-Plus\Source\Application-Protocols\network_transport\transport_mbedtls_pkcs11.c
已修改为使用 PKCS #11。请参阅
FreeRTOS-Plus\Source\Application-Protocols\network_transport\transport_mbedtls_pkcs11.c
和
FreeRTOS-Plus\Source\Application-Protocols\network_transport\transport_mbedtls_pkcs11.h
,了解如何使用 PKCS#11 建立 TLS 连接。
应用程序层也存在代码更改,强调使用 PKCS #11 进行凭据管理。例如,
在 FreeRTOS-Plus\Demo\corePKCS11_MQTT_Mutual_Auth_Windows_Simulator\PKCS11_Mqtt_MutualAuthDemo.c
中,
NetworkCredentials
结构体不包含客户端证书和密钥,
这与 FreeRTOS-Plus\Demo\coreMQTT_Windows_Simulator\MQTT_Mutual_Auth\DemoTasks\MutualAuthMQTTExample.c
不同。
作为额外的步骤,请尝试将您的 .dat 文件移动到不同的目录中演示。这将导致无法与 AWS IoT 核心建立新连接,因此演示的后续迭代将失败。有关成功演示的输出示例,请参阅 MQTT 演示系列。
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.