1、安装 python 依赖项
cd ~/esp/esp-matter/tools/mfg_tool
python3 -m pip install -r requirements.txt
cd ~/esp/esp-matter/connectedhomeip/connectedhomeip
source scripts/activate.sh
gn gen out/host
ninja -C out/host
export PATH="$PATH:~/esp/esp-matter/connectedhomeip/connectedhomeip/out/host"
cd ~/esp/esp-matter/tools/mfg_tool
./mfg_tool.py -cn "Mythermostat" -v 0xFFF2 -p 0x8001 --pai -k ~/esp/esp-matter/connectedhomeip/connectedhomeip/credentials/test/attestation/Chip-Test-PAI-FFF2-8001-Key.pem -c ~/esp/esp-matter/connectedhomeip/connectedhomeip/credentials/test/attestation/Chip-Test-PAI-FFF2-8001-Cert.pem -cd ~/esp/esp-matter/connectedhomeip/connectedhomeip/credentials/test/certification-declaration/Chip-Test-CD-FFF2-8001.der
将生成的信息写入flash
//烧录进nvs分区
esptool.py write_flash 0x10000 ~/esp/esp-matter/tools/mfg_tool/out/fff2_8001/e5928011-f022-4c47-bc90-0f30115bb9dd/e5928011-f022-4c47-bc90-0f30115bb9dd-partition.bin
配置出厂信息分区
烧录生成的信息进对应分区
# Name, Type, SubType, Offset, Size, Flags
# Note: Firmware partition offset needs to be 64K aligned, initial 36K (9 sectors) are reserved for bootloader and partition table
esp_secure_cert, 0x3F, ,0xd000, 0x2000, encrypted
nvs, data, nvs, 0x10000, 0x6000,
nvs_keys, data, nvs_keys,, 0x1000, encrypted
otadata, data, ota, , 0x2000
phy_init, data, phy, , 0x1000,
ota_0, app, ota_0, 0x20000, 0x1E0000,
ota_1, app, ota_1, 0x200000, 0x1E0000,
fctry, data, nvs, 0x3E0000, 0x6000
//烧录进fatry 也可以使用乐鑫的烧录工具进行写入
esptool.py write_flash 0x3E0000 ~/esp/esp-matter/tools/mfg_tool/out/fff2_8001/e5928011-f022-4c47-bc90-0f30115bb9dd/e5928011-f022-4c47-bc90-0f30115bb9dd-partition.bin
配网连接码
//QR code 链接
https://project-chip.github.io/connectedhomeip/qrcode.html?data=MT:634J0CEK0119UQ4N410
//手动配对码:
53070553
之后就可以使用生成的新QRcode进行配网
2、配置sdkconfig
启用ESP32 Factory Data Provider
[组件配置 → CHIP 设备层 → 调试选项 → 使用 ESP32 Factory Data Provider]
启用配置选项CONFIG_ENABLE_ESP32_FACTORY_DATA_PROVIDER以使用 CommissionableDataProvider 和 DeviceAttestationCredentialsProvider 的 ESP32 特定实现。
启用ESP32 Device Instance Info Provider
[组件配置 → CHIP 设备层 → 调试选项 → 使用 ESP32 设备实例信息提供程序]
启用配置选项ENABLE_ESP32_DEVICE_INSTANCE_INFO_PROVIDER以从工厂分区获取设备实例信息。
启用Attestation - Factory
[组件配置 → ESP 事项 → DAC 提供商选项 → 证明 - 工厂]
启用配置选项CONFIG_FACTORY_PARTITION_DAC_PROVIDER以在证明期间使用来自工厂分区的 DAC 证书。
设置chip-factory namespace partition label
【组件配置→CHIP设备层→物质制造选项→芯片工厂命名空间分区标签】
设置配置选项CHIP_FACTORY_NAMESPACE_PARTITION_LABEL以选择分区标签以将键值存储在“chip-factory”命名空间中。默认选择的分区标签是nvs
使用 esp安全证书分区
1.1 ESP 安全证书分区
- 预先预配设备时,将为 设备并存储在名为 ESP安全证书的分区中。
- 在事务预配置服务中,事务 DAC 证书是 在 ESP安全证书分区中预烧录。
- ESP32SecureCertDACProvider 读取 PKI 凭据 尤其是安全cert_partition。
- DAC,PAI和私钥是从esp安全证书分区读取的,但是 证书声明是从工厂数据分区读取的。 因此,除了 ESP安全证书分区。
- esp安全证书分区可以在主机上生成 configure_esp安全的cert.py 实用程序。
- esp安全cert_partition的使用在照明应用程序中进行了演示。
1.2 先决条件:
要生成 esp安全证书分区和工厂数据分区,我们 需要 DAC 和 PAI 证书以及 .der 中的私钥(DAC 密钥) 格式。工厂data_provider还需要证书 .der 格式的声明。生成所需的证书和密钥 在下面给出的步骤中提到。
1.2.1 构建认证生成工具:
运行以下命令:
cd path/to/connectedhomeip
source scripts/activate.sh
gn gen out/host
ninja -C out/host
chip-cert cd out/host
在 /path/to/connectedhomeip/out/host 处运行以下命令。
1.2.2 生成认证声明 CD证书
./chip-cert gen-cd -K ../../credentials/test/certification-declaration/Chip-Test-CD-Signing-Key.pem -C ../../credentials/test/certification-declaration/Chip-Test-CD-Signing-Cert.pem -O esp_dac_fff1_8000.der -f 1 -V 0xfff1 -p 0x8000 -d 0x0016 -c "CSA00000SWC00000-01" -l 0 -i 0 -n 1 -t 0
1.2.3 生成PAI
./chip-cert gen-att-cert -t i -c "ESP TEST PAI" -V 0xfff1 -P 0x8000 -C ../../credentials/development/attestation/Chip-Development-PAA-Cert.pem -K ../../credentials/development/attestation/Chip-Development-PAA-Key.pem -o Esp-Development-PAI-Cert.pem -O Esp-Development-PAI-Key.pem -l 4294967295
自建测试PAI
./chip-cert gen-att-cert -t i -c "ESP TEST PAI" -V 0x1280 -P 0x0301 -C ./temp/PAA_certificate.pem -K ./temp/PAA_key.pem -o ./temp/SiterWell-PAI-Cert.pem -O ./temp/SiterWell-PAI-Key.pem -l 4294967295
1.2.4 生成数字转换器 DAC
./chip-cert gen-att-cert -t d -c "ESP TEST DAC 01" -V 0xfff1 -P 0x8000 -C Esp-Development-PAI-Cert.pem -K Esp-Development-PAI-Key.pem -o Esp-Development-DAC-01.pem -O Esp-Development-DAC-Key-01.pem -l 4294967295
./chip-cert gen-att-cert -t d -c "ESP TEST DAC 01" -V 0xfff1 -P 0x8000 -C ./temp/SiterWell-PAI-Cert.pem -K ./temp/SiterWell-PAI-Key.pem -o SiterWell-DAC-01.pem -O SiterWell-DAC-Key-01.pem -l 4294967295
1.2.5 更改证书和密钥的格式(.pem 到 .der 格式)
- 将 DAC 密钥从 .pem 转换为 .der 格式。
openssl ec -in Esp-Development-DAC-Key-01.pem -out Esp-Development-DAC-Key-01.der -inform pem -outform der
- 将 DAC 和 PAI 证书从 .pem 转换为 .der 格式
openssl x509 -in Esp-Development-DAC-01.pem -out Esp-Development-DAC-01.der -inform pem -outform der
openssl x509 -in Esp-Development-PAI-Cert.pem -out Esp-Development-PAI-Cert.der -inform pem -outform der
步骤 1.2 中的证书将在 /path/to/connectedhomeip/out/host.有关步骤 1.3 和 1.4,请转到 连接家庭IP/脚本/工具 ,设置IDF_PATH。
生成证书流程小总结:
1、生成PAA
./chip-cert gen-att-cert --type a --subject-cn "Matter Development PAA 01" --valid-from "2020-10-15 14:23:43" --lifetime 7305 --out-key Chip-PAA-Key.pem --out Chip-PAA-Cert.pem
2、生成PAI
./chip-cert gen-att-cert --type i --subject-cn "Matter Development PAI 01" --subject-vid FFF1 --valid-from "2020-10-15 14:23:43" --lifetime 7305 --ca-key Chip-PAA-Key.pem --ca-cert Chip-PAA-Cert.pem --out-key Chip-PAI-Key.pem --out Chip-PAI-Cert.pem
3、生成DAC
./chip-cert gen-att-cert --type d --subject-cn "Matter Development DAC 01" --subject-vid FFF1 --subject-pid 0123 --valid-from "2020-10-15 14:23:43" --lifetime 7305 --ca-key Chip-PAI-Key.pem --ca-cert Chip-PAI-Cert.pem --out-key Chip-DAC-Key.pem --out Chip-DAC-Cert.pem
4、验证节点证书
./chip-cert validate-att-cert --dac Chip-DAC-Cert.pem --pai Chip-PAI-Cert.pem --paa Chip-PAA-Cert.pem
5、也可以使用OpenSSL进行证书链验证同第四步
openssl verify -CAfile Chip-PAA-Cert.pem -untrusted Chip-PAI-Cert.pem Chip-DAC-Cert.pem
1.3 生成 esp安全cert_partition
要生成 esp安全cert_partition请使用
pip install esp-secure-cert-tool
生成 esp安全cert_partition的示例命令
configure_esp_secure_cert.py --private-key path/to/dac-key --device-cert path/to/dac-cert --ca-cert path/to/pai-cert --target_chip esp32c3 --port /dev/ttyUSB0 -- skip_flash
~/.espressif/python_env/idf5.0_py3.8_env/lib/python3.8/site-packages/configure_esp_secure_cert.py
指 https://github.com/espressif/esp安全cert_mgr/树/主/工具#生成-esp安全证书分区 以获取更多帮助。
1.4 生成工厂数据分区
生成工厂数据分区的示例命令
./generate_esp32_chip_factory_bin.py -d 3434 -p 99663300 \ --product-name ESP-lighting-app --product-id 0x8000 \ --vendor-name Test-vendor --vendor-id 0xFFF1 \ --hw-ver 1 --hw-ver-str DevKit \ --dac-cert path/to/dac-cert \ --dac-key path/to/dac-key \ --pai-cert path/to/pai-cert \ --cd path/to/certificate-declaration
指 https://github.com/project-chip/connectedhomeip/blob/master/docs/guides/esp32/factorydata.md#generate-nvs-binary-image 以生成工厂data_partition。
1.5 使用以下配置选项构建固件
```
禁用 DS 外设支持
CONFIGESPSECURE_CERTDSPERIPHERAL=n
使用 DAC 提供程序实现从安全证书分区读取证明数据
CONFIGSECCERTDACPROVIDER=Y
启用一些从出厂分区读取CD和其他基本信息的选项
配置启用ESP32工厂数据提供程序=Y 配置启用ESP32设备实例信息提供程序=Y 配置芯片工厂命名空间分区标签=“FCTRY” ```
为了使用esp安全证书分区,除了启用上述 配置选项,您还应该具有 ESP安全证书分区和工厂 应用中的分区。有关参考,请参阅分区.csv文件 照明应用程序。
1.6 烧录固件、安全证书和出厂分区
构建和刷新
idf.py -p (PORT) build flash
闪存和出厂分区二进制文件esp_secure_cert
分区二进制文件包含设备证明信息 工厂分区二进制文件包含物质制造特定数据。esp_secure_cert
- 闪存分区二进制文件
esptool.py -p (PORT) write_flash 0xd000 path/to/secure_cert_partition.bin
- 闪存工厂分区二进制文件
esptool.py -p (PORT) write_flash 0x3E0000 path/to/factory_partition.bin
监控
idf.py monitor
请通过查看地址来刷新上述分区 分区.csv.上述命令仅用于示例目的。
1.6 使用切屑工具测试调试
从主机运行以下命令以调试设备。
./chip-tool pairing ble-wifi 1234 my_SSID my_PASSPHRASE my_PASSCODE my_DISCRIMINATOR --paa-trust-store-path /path/to/PAA-Certificates/
例如:
./chip-tool pairing ble-wifi 0x7283 my_SSID my_PASSPHRASE 99663300 3434 --paa-trust-store-path /path/to/connectedhomeip/credentials/development/attestation/
测试生成温控器证书:
VID,PID和测试PAI自己生成后
//启动环境
get_idf
get_matter
//安装依赖
python3 -m pip --default-timeout=200 install -r requirments.txt
cd connectedhomeip/connectedhomeip
//gn gen out/host 我已经生成环境不需要再执行
//ninja -C build
//生成CD证书 -CHIP认证声明签名消息。-K:包含用于签署新证书的CA私钥的文件或字符串, -C:包含要用于签署新证书的CA证书的文件或字符串
out/host/chip-cert gen-cd -f 1 -V 0x1xxx -p 0x0301 -d 0x00E \
-c "CSA00000SWC00000-01" -l 0 -i 0 -n 1 -t 0 \
-K credentials/test/certification-declaration/Chip-Test-CD-Signing-Key.pem \
-C credentials/test/certification-declaration/Chip-Test-CD-Signing-Cert.pem \
-O TEST_CD_1xxx_0301.der
cd esp/esp-matter/tools/mfg_tool
//生成工厂分区用于调试测试设备
./mfg_tool.py --passcode 20202023 \
--discriminator 3841 \
-cd TEST_CD_1280_0301.der \
-v 0x1xxx --vendor-name siterwell \
-p 0x0301 --product-name Thermostat\
--hw-ver 1 --hw-ver-str DevKit
//生成结果:目前不指定大小则默认为0x6000==24K大小的bin文件 '-s', '--size', type=any_base_int, default=0x6000
[2023-07-26 00:32:03,806] [ INFO] - Do not include the device attestation certificates and keys in partition binaries
[2023-07-26 00:32:03,806] [ INFO] - Number of manufacturing NVS images to generate: 1
[2023-07-26 00:32:03,858] [ INFO] - Generating Config CSV...
[2023-07-26 00:32:03,858] [ INFO] - Writing chip manifest CSV header...
[2023-07-26 00:32:03,859] [ INFO] - Appending chip master CSV row...
[2023-07-26 00:32:03,862] [ INFO] - Generated QR code: MT:4C9A00QJ01I.0648G00
[2023-07-26 00:32:03,862] [ INFO] - Generated manual code: 3497-031-2335
[2023-07-26 00:32:03,903] [ INFO] - Generated onboarding data and QR Code
[2023-07-26 00:32:03,907] [ INFO] - creating out/1xxx_301/csv
[2023-07-26 00:32:03,907] [ INFO] - creating out/1xxx_301/bin
Created CSV file: ===> out/1xxx_301/csv/matter_partition-1.csv
Creating NVS binary with version: V2 - Multipage Blob Support Enabled
Created NVS binary: ===> out/1xxx_301/bin/matter_partition-1.bin
Files generated in out/1280_301 ...
[2023-07-26 00:32:03,911] [ INFO] - Generated output files at: out/1xxx_301/6d37f610-66f6-4a95-931c-e041cefc2400
esptool.py write_flash 0x3E0000 ~/code/cert/thrermostat-6d37f610-66f6-4a95-931c-e041cefc2400-partition.bin
//可用于调试的信息
PID:0x0301,
VID:0x1xxx,
dev-type:0x00E,
pin-code:20202023,
manualcode:3497-031-2335,
discriminator:3841,
QR code: MT:4C9A00QJ01I.0648G00
读取DAC并确认
如果实现了 esp_secure_cert 分区并将正确的安全证书二进制文件闪存到该分区中,那么可以像下面的伪代码一样读取并确认 DAC。
#include <credentials/CHIPCert.h>
#include <credentials/DeviceAttestationCredsProvider.h>
#include <platform/CommissionableDataProvider.h>
using namespace chip;
using namespace chip::DeviceLayer;
using namespace chip::Credentials;
uint16_t discriminator;
CHIP_ERROR chip_err = GetCommissionableDataProvider()->GetSetupDiscriminator(discriminator);
if (chip_err == CHIP_NO_ERROR) {
ESP_LOGI(TAG, "fctry successfully read");
} else {
ESP_LOGI(TAG, "fctry read failed");
}
uint8_t der_cert_buf[kMaxDERCertLength];
MutableByteSpan der_cert_span(der_cert_buf);
chip_err = GetDeviceAttestationCredentialsProvider()->GetDeviceAttestationCert(der_cert_span);
if (chip_err == CHIP_NO_ERROR) {
ESP_LOGI(TAG, "esp_secure_cert successfully read");
} else {
ESP_LOGI(TAG, "esp_secure_cert read failed");
}
AttestationCertVidPid dacVidPid;
chip_err = ExtractVIDPIDFromX509Cert(der_cert_span, dacVidPid);
if (chip_err == CHIP_NO_ERROR) {
ESP_LOGI(TAG, "VID in DAC: %d, PID in DAC: %d", dacVidPid.mVendorId.Value(), dacVidPid.mProductId.Value());
} else {
ESP_LOGI(TAG, "DAC Format Invalid");
}
参考: