2387366_zh-CN

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

2387366_zh-CN

2387366_zh-CN

如何在 i.MX 93 上使用 EdgeLock® 安全隔离区 (ELE):通过 PKCS#11 存储和使用加密密钥(日语博客)
本文解释了如何通过 PKCS#11 使用i.MX 93 内置的EdgeLock ®安全隔离区 (ELE) 的加密加速器和密钥管理功能。
PKCS#11 是密码学中广泛使用的 API,并且可以与另一个广泛使用的库 OpenSSL 集成。因此,所有使用 PKCS#11 或 OpenSSL 进行身份验证的应用程序(例如 Eclipse Mosquitto ™等)都可以应用保护,而无需对应用程序本身进行任何修改
它提供加密加速和密钥管理功能,这一点与SE050等安全元件相同,SE050 将在另一篇文章中介绍。
有关加密加速器和密钥管理的概述,以及与安全元件的一般比较和使用指南,请参阅以下文章。
预计时间:约 55 分钟(不包括 Yocto 构建时间)
  1. 使用 pkcs11 工具通过 ELE 进行操作:10 分钟
  2. 使用 OpenSSL 通过 ELE 运行:10 分钟
  3. 创建 PKCS#11 URI PEM 文件:5 分钟
  4. 与 Azure IoT 中心的云连接:30 分钟
Keita_Nagashima_0-1785473891452.png
 

测试环境


硬件:

  • FRDM i.MX 93 开发板 ( FRDM-IMX93 )
  • 32GB microSD 卡(如果您要将镜像写入 SD 卡并使用它。据说 16GB 的卡也可以。)

软件:

  • Linux BSP 版本 L6.18.2-1.0.0
*FRDM-IMX93 网页上的预构建镜像无法正常工作,请按照以下说明进行构建。

【新手指南】如何构建 Yocto Linux BSP - i.MX FRDM 开发板版(日语博客)

 
构建时,我在运行 repo init 和 imx-setup-release.sh 时使用了以下命令:
repo init -u https://github.com/nxp-imx/imx-manifest -b imx-linux-whinlatter -m imx-6.18.2-1.0.0.xml
DISTRO=fsl-imx-wayland MACHINE=imx93-11x11-lpddr4x-frdm source imx-setup-release.sh -b ./build
 
 

EdgeLock® 安全隔离区 (ELE) 概述

 
在 i.MX 93 中,“EdgeLock® 安全隔离区 (ELE)”是一个安全模块,它集成了 NXP 提供的众多高级安全功能,包括加密加速器、密钥管理、整体 SoC 监控和访问权限管理。
 
安全启动是监控整个SoC并管理访问权限的一项代表性功能。有关i.MX 93中的安全启动及其使用方法,请参阅以下文章。
 
本文解释了如何通过 PKCS#11 使用加密加速器和密钥管理功能。
 
 

i.MX 安全中间件 (SMW) 概述

 
NXP 提供 i.MX SMW(安全中间件)软件,用于控制 i.MX 处理器内置的安全硬件。
 
SMW 提供与硬件无关的 API,包括 PKCS#11 API,稍后将对此进行讨论。
由于 i.MX 93 内置了 ELE,因此实际控制 ELE 的部分是 imx-secure-enclave。
 
 

PKCS#11概述


PKCS#11(公钥密码学标准#11)是一个API规范,用于在应用程序中统一使用加密硬件和软件(例如,HSM、智能卡、USB令牌等)。它也被称为“Cryptoki”。

在这个例子中,我们将使用 pkcs11-tool 作为使用 PKCS#11 的应用程序。

imx-smw之间的关系可以表示如下:

PKCS#11を使用するアプリケーション(pkcs11-tool etc.)
↓ (PKCS#11 API経由での使用)
imx-smw
↓
imx-secure-enclave
↓
EdgeLock Secure Enclave Hardware
 
 

此外,在之前一篇关于通过 OpenSSL 使用 SE050 的文章中,我们解释了如何使用 Plug and Trust Middleware 中包含的 openssl 提供程序通过 openssl 来使用它。

SMW 不提供 openssl 提供程序,但可以通过 openssl 使用 ELE,因为可以通过使用 pkcs11-provider 从 openssl 使用 PKCS#11 接口。

GitHub - openssl-projects/pkcs11-provider:适用于 OpenSSL 3.0+ 的 pkcs#11 提供程序 · GitHub


下面图示了不使用 OpenSSL 提供程序与使用 imx-smw + PKCS 之间的关系。

当不使用密钥提供商时,密钥以文件的形式存在于文件系统中,加密由软件执行。

使用 imx-smw 和 pkcs11-provider 时,密钥和加密过程由 ELE 硬件保护。要使用的密钥由代码或文件系统中的 PKCS#11 URI 指定。

什么是URI?
这是一个标准化的标识符(URI),用于指定安全地存储在硬件安全模块(HSM)或类似设备中的私钥和证书,而不是本地文件路径。
 

注意:Plug and Trust Middleware 还提供 PKCS#11 API。

画像1.png


通过 pkcs11-tool 使用 ELE

 
使用说明在 SMW 中的PKCS11 工具用户指南中有描述,但本说明将特别关注 ECDSA 签名和验证过程。
 
首先,运行以下命令启动 nvm_daemon。
nvm_daemon 是一项管理文件系统空间以供 ELE 使用的服务。
systemctl start nvm_daemon
systemctl status nvm_daemon
 
您还可以通过执行以下命令,将其配置为在下次启动时自动启动。
systemctl enable nvm_daemon
 
为了简化后续命令,请使用以下命令指定 libsmw_pkcs11 的位置。
末尾的数字可能因 SMW 版本而异,请根据您安装的版本进行调整。
export MODULE_PKCS11=/usr/lib/libsmw_pkcs11.so.5
 
以下命令将检查可通过 libsmw_pkcs11 验证的令牌。
pkcs11-tool --module $MODULE_PKCS11 -L
 
如果您看到与以下示例类似的显示,则说明它运行正常。
Available slots:
Slot 0 (0x0): Security Middleware Abstraction
  token label        : smw
  token manufacturer : NXP Semiconductor
  token model        :
  token flags        : login required, PIN pad present, token initialized
  hardware version   : 0.0
  firmware version   : 0.0
  serial num         :
  pin min/max        : 0/0
  uri                : pkcs11:model=;manufacturer=NXP%20Semiconductor;serial=;token=smw
 
以下命令将显示可用对象列表。
一开始不应该显示任何内容。
pkcs11-tool --module $MODULE_PKCS11 --login -O
 
以下命令将生成 ECC 密钥对。
pkcs11-tool --module $MODULE_PKCS11 \
            --login \
            --keypairgen \
            --key-type EC:prime256v1 \
            --id 02 \
            --label "MyECCKey" \
            --usage-sign \
            --allowed-mechanisms "ECDSA-SHA256"
 
如果再次显示对象列表,您应该会看到如下所示的 ECC 密钥对。
Using slot 0 with a present token (0x0)
Profile object 250360144
  profile_id:          CKP_BASELINE_PROVIDER (1)
Public Key Object; EC  EC_POINT 256 bits
  EC_POINT:   044104fe4c97a7a4f54702f9fc5740f62c0864e851098dc43cb4c9ba8633421e5bc362cdc559523118bb4fe4281851c051e24a88846a2d774eb3f928595761cf719e90
  EC_PARAMS:  06082a8648ce3d030107 (OID 1.2.840.10045.3.1.7)
  label:      MyECCKey
  ID:         02
  Usage:      verify
  Access:     none
  Unique ID:
  uri:        pkcs11:model=;manufacturer=NXP%20Semiconductor;serial=;token=smw;id=%02;object=MyECCKey;type=public
Private Key Object; EC
  label:      MyECCKey
  ID:         02
  Usage:      sign
  Access:     sensitive, always sensitive
  Unique ID:
  uri:        pkcs11:model=;manufacturer=NXP%20Semiconductor;serial=;token=smw;id=%02;object=MyECCKey;type=private
 
以下命令将生成一个合适的 message.txt 文件,然后您可以生成并验证该文件的签名。
echo hello > message.txt
pkcs11-tool --module $MODULE_PKCS11 \
            --login \
            --sign \
            --id 02 \
            --mechanism ECDSA-SHA256 \
            --input-file message.txt \
            --output-file signature.bin
pkcs11-tool --module $MODULE_PKCS11 \
            --login \
            --verify \
            --id 02 \
            --mechanism ECDSA-SHA256 \
            --input-file message.txt \
            --signature-file signature.bin
 
 

通过 openssl 使用 ELE

 
同样,我们将解释整个过程,重点关注 ECDSA 的签署和验证。
这假设您已经启动了 nvm_daemon 并使用上一章中描述的 pkcs11-tool 程序生成了 ECC 密钥对。
 
创建一个名为 openssl.cnf 的文件,内容如下:
末尾的 `module` 和 `pkcs11-module-path` 行可能需要根据您的实际系统进行更改。
openssl_conf = openssl_init

[openssl_init]
providers = provider_sect

[provider_sect]
default = default_sect
pkcs11 = pkcs11_sect

[default_sect]
activate = 1

[pkcs11_sect]
module = /usr/lib/ossl-modules/pkcs11.so
pkcs11-module-path = /usr/lib/libsmw_pkcs11.so.5
activate = 1
 
使用以下命令配置 openssl 以使用上述配置文件。
export OPENSSL_CONF=<作成したopenssl.cnfの絶対path>
 
可以使用以下命令生成和验证签名。
openssl pkeyutl -sign -inkey "pkcs11:object=MyECCKey;type=private" -in message.txt -out sig.bin -digest sha256
openssl pkeyutl -verify -pubin -inkey "pkcs11:object=MyECCKey;type=public" -in message.txt -sigfile sig.bin -digest sha256
 
 

创建 PKCS#11 URI PEM 文件

 
在使用 openssl 提供程序时,我使用了一个可以直接在对象列表中验证的 URI 作为键。
 
然而, pkcs11-provider 文档在“在旧应用程序中使用(PEM 文件中的 URI)”部分指出,这是一种新方法,在使用旧应用程序时可能无法使用。
 
事实上,稍后将讨论的 Mosquitto 客户端的代码会阻止您在使用 openssl 3.0 或更高版本时直接指定 URI。
 
在这种情况下,您可以使用CLI 工具 uri2pem.py生成包含 URI 的文件,并以与指定常规密钥文件相同的方式使用它。
 
使用从上述页面下载的 uri2pem.py,通过以下命令生成包含 PKCS#11 URI 的文件。
python3 uri2pem.py --out MyECCKey.pem "pkcs11:object=MyECCKey;type=private"

虽然我还没有能够确认细节,但根据 uri2pem.py 的内容来看,似乎无法为私钥以外的 URI 创建 pem 文件。

通过指定生成的“MyECCKey.pem”作为签名密钥,您可以执行与以前相同的操作。

openssl pkeyutl -sign -inkey MyECCKey.pem -in message.txt -out sig.bin -digest sha256
openssl pkeyutl -verify -pubin -inkey "pkcs11:object=MyECCKey;type=public" -in message.txt -sigfile sig.bin -digest sha256
 
 

使用 ELE 中的密钥,通过 Eclipse Mosquitto ™客户端连接到 Azure IoT 中心云。

 
我们将尝试使用生成的密钥通过 Mosquitto 客户端建立与 Azure IoT 中心的云连接。
 
注意:使用此过程创建的根 CA 证书仅用于测试目的。建议在测试完成后从 Azure IoT 中心删除该证书。
 
提前
“构建和安装 Mosquitto 客户端”这一章节
 
在“创建 Azure IoT 中心”这一章中,
 
按照每个步骤完成 Mosquitto 客户端的安装和 Azure IoT 中心的创建。
 
 
首先,在 FRDM-IMX93 端,执行以下命令为 MyECCKey 的公钥创建证书请求并验证其内容。
openssl req -new -key "pkcs11:object=MyECCKey" -outform PEM -subj /CN=frdmimx93_test -out frdmimx93_test.csr -sha256
openssl req -text -noout -in frdmimx93_test.csr

 

接下来,将“frdmimx93_test.csr”移动到主机,并执行以下操作:

openssl ecparam -genkey -name prime256v1 -out rootCA_key_pair.pem
openssl req -new -x509 -subj /CN=rootCA -key rootCA_key_pair.pem > rootCA_cert.cer
openssl x509 -req -in frdmimx93_test.csr -days 365 -CA rootCA_cert.cer -CAkey rootCA_key_pair.pem -out frdmimx93_test_cert.cer

将创建的“frdmimx93_test_cert.cer”放回FRDM-IMX93上。由于稍后将与“ MyECCKey.pem ”一起使用,请将其放在创建它的同一目录中。

此外,您还需要在 Azure IoT 中心注册创建的“rootCA_cert.cer”文件,并创建一个名为“frdmimx93_test”的设备。

有关说明,请参阅以下文章中的“向 Azure IoT 中心添加中间 CA 证书”部分。

注意:如上所述,此处注册的证书仅用于测试目的,因此建议在确认其功能后将其删除。

 
完成这些步骤后,您就可以使用 Mosquitto 客户端连接到 Azure IoT 中心了。
 
执行以下命令。请根据实际情况更改 IOT_HUB_NAME。
export IOT_HUB_NAME=ShinjiIotHubTest
export DEVICE_NAME=frdmimx93_test
mosquitto_pub -h "${IOT_HUB_NAME}.azure-devices.net" -p 8883 -u "${IOT_HUB_NAME}.azure-devices.net/${DEVICE_NAME}/api-version=2016-11-14" -t "devices/${DEVICE_NAME}/messages/events/" -m '{"mes":"Hello Azure with i.MX93!"}' --capath /etc/ssl/certs/ --cert frdmimx93_test_cert.cer --key MyECCKey.pem -i ${DEVICE_NAME} -d -q 1

如果看到类似以下的输出,则表示成功。

Client frdmimx93_test sending CONNECT
Client frdmimx93_test received CONNACK (0)
Client frdmimx93_test sending PUBLISH (d0, q1, r0, m1, 'devices/frdmimx93_test/messages/events/', ... (34 bytes))
Client frdmimx93_test received PUBACK (Mid: 1, RC:0)
Client frdmimx93_test sending DISCONNECT

按照以下文章“检查发送到 IoT 中心的消息和向设备发送消息”中的步骤,您还可以在 Azure IoT 中心端的 Cloud Shell 中检查接收到的消息。


=========================

我们目前无法 回复 此帖子“
评论”部分留下的评论。 对于由此造成的不便,我们深表歉意,但 在进行咨询时, 请 参考“ NXP 技术问题 - 如何联系我们 日语博客 ” 。
(如果您已经是 恩智浦的 分销商或 与 恩智浦 有合作关系 ,您可以直接咨询您的代表。)

本文解释了如何通过 PKCS#11 使用 i.MX 93 内置 EdgeLock® 安全隔离区 (ELE) 的加密加速器和密钥管理功能。
PKCS#11 是密码学中广泛使用的 API,并且可以与另一个广泛使用的库 OpenSSL 集成。因此,所有使用 PKCS#11 或 OpenSSL 进行身份验证的应用程序(例如 Eclipse Mosquitto ™等)都可以应用保护,而无需对应用程序本身进行任何修改
它提供加密加速和密钥管理功能,这一点与 SE050 等安全元件相同,SE050 将在另一篇文章中介绍。
有关加密加速器和密钥管理的概述,以及与安全元件的一般比较和使用指南,请参阅以下文章。
预计时间:约 55 分钟(不包括 Yocto 构建时间)
  1. 使用 pkcs11 工具通过 ELE 进行操作:10 分钟
  2. 使用 OpenSSL 通过 ELE 运行:10 分钟
  3. 创建 PKCS#11 URI PEM 文件:5 分钟
  4. 与 Azure IoT 中心的云连接:30 分钟
 
i.MX 处理器安全日本博客
タグ(1)
評価なし
バージョン履歴
最終更新日:
1週間前
更新者: