硬件:
软件:
【新手指南】如何构建 Yocto Linux BSP - i.MX FRDM 开发板版(日语博客)
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 ./buildPKCS#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 指定。
注意:Plug and Trust Middleware 还提供 PKCS#11 API。
systemctl start nvm_daemon
systemctl status nvm_daemonsystemctl enable nvm_daemonexport MODULE_PKCS11=/usr/lib/libsmw_pkcs11.so.5pkcs11-tool --module $MODULE_PKCS11 -LAvailable 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=smwpkcs11-tool --module $MODULE_PKCS11 --login -Opkcs11-tool --module $MODULE_PKCS11 \
--login \
--keypairgen \
--key-type EC:prime256v1 \
--id 02 \
--label "MyECCKey" \
--usage-sign \
--allowed-mechanisms "ECDSA-SHA256"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=privateecho 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.binopenssl_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 = 1export 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 sha256python3 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 sha256openssl 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 证书”部分。
注意:如上所述,此处注册的证书仅用于测试目的,因此建议在确认其功能后将其删除。
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 技术问题 - 如何联系我们 ( 日语博客 ) ” 。
(如果您已经是 恩智浦的 分销商或 与 恩智浦 有合作关系 ,您可以直接咨询您的代表。)