Công cụ cấp phép nhà máy OpenWeave

Xem nguồn trên GitHub

Công cụ cấp phép nhà máy OpenWeave cung cấp phương tiện thuận tiện để cấp phép thông tin cấu hình cố định trên mỗi thiết bị trên các thiết bị hỗ trợ Weave. Mục đích của Công cụ cấp phép nhà máy là một phần của quy trình sản xuất, trong đó đóng dấu các thiết bị riêng lẻ có thông tin nhận dạng và thông tin xác thực riêng biệt trước khi giao hàng cho khách hàng. Nhà phát triển cũng có thể sử dụng phần mềm này để cá nhân hóa phần cứng trước khi sản xuất được sử dụng trong quá trình phát triển.

Lý thuyết hoạt động

Mục tiêu của Công cụ cấp phép nhà máy của OpenWeave là chèn thông tin cấu hình chọn lọc vào một cửa hàng cấu hình cố định của thiết bị, tại đó chương trình cơ sở của thiết bị có thể được chọn và sử dụng vào thời gian chạy. Cấu hình thiết bị ổn định thường được lưu trữ trong bộ nhớ flash trong của thiết bị, mặc dù chi tiết chính xác về cách dữ liệu được lưu trữ và ở định dạng nào, các nền tảng này có thể khác nhau. Bản thân Công cụ cấp phép nhà máy độc lập với định dạng bộ nhớ cuối cùng và dựa vào mã trong chương trình cơ sở của thiết bị để viết dữ liệu theo đúng cách. Giao diện người dùng của công cụ này cũng chủ yếu độc lập với loại phần cứng được định cấu hình, nghĩa là có thể sử dụng quy trình sản xuất tương tự trên các dòng sản phẩm dựa trên các nền tảng phần cứng khác nhau.

Công cụ cấp phép nhà máy được thiết kế để chạy công việc trên máy chủ được kết nối với thiết bị mục tiêu thông qua một số giao diện gỡ lỗi hoặc điều khiển – ví dụ: cổng JTAG hoặc SWD. Công cụ này hoạt động bằng cách đưa thông tin cấp phép vào RAM của thiết bị ở dạng mã hóa đặc biệt. Sau đó, thiết bị được hướng dẫn khởi động lại. Tại thời điểm đó, mã điểm tích hợp sẵn trong chương trình cơ sở của thiết bị sẽ xác định dữ liệu được mã hóa, xác thực tính toàn vẹn và ghi các giá trị chứa trong đó vào bộ nhớ ổn định ở định dạng phù hợp với nền tảng.

Mã trên thiết bị phát hiện và xử lý dữ liệu cung cấp được tích hợp sẵn vào Lớp thiết bị OpenWeave và có thể được bật trên bất kỳ nền tảng nào được hỗ trợ. Sau khi bật, mã sẽ tự động chạy mỗi khi thiết bị khởi động, tại một thời điểm sớm trong quá trình khởi tạo thiết bị. Mã này hoạt động bằng cách quét một vùng RAM dành riêng cho nền tảng. Trên các nền tảng có dung lượng bộ nhớ khá thấp (ví dụ: <1M), quá trình quét bao gồm tất cả RAM có sẵn.

Khi được đặt vào RAM, dữ liệu cấp phép được mã hóa bằng một tiền tố dễ nhận dạng, giúp nhanh chóng tìm thấy dữ liệu này trong quá trình quét. Giá trị kiểm tra tính toàn vẹn dựa trên hàm băm mật mã dùng để xác nhận tính hợp lệ của dữ liệu trước khi xử lý.

Theo mặc định, công cụ cấp phép sẽ chọn vị trí RAM để chèn dữ liệu cung cấp dựa trên nền tảng thiết bị mục tiêu. Bạn có thể ghi đè lựa chọn này thông qua một đối số cho công cụ. Nói chung, chương trình cơ sở của thiết bị không yêu cầu phải đặt trước vị trí RAM riêng để nhận dữ liệu được cấp phép. Thông thường, dữ liệu cấp phép được ghi vào vị trí RAM được phân bổ cho các mục đích khác, nhưng thường không được sử dụng sớm trong quá trình khởi động thiết bị. Các lựa chọn phổ biến là phần đầu của ngăn xếp hệ thống ban đầu hoặc ở đầu của đấu trường webhook.

Công cụ cấp phép nhà máy sử dụng một bộ công cụ phát triển bên ngoài để giao diện với thiết bị mục tiêu. Các công cụ cụ thể được sử dụng tùy thuộc vào loại thiết bị mục tiêu. Hai giao diện thiết bị hiện được hỗ trợ:

  • một đầu dò gỡ lỗi SEGGER J-Link kết nối với cổng JTAG hoặc SWD của thiết bị
  • cổng nối tiếp USB kết nối với Espressif ESP32

Giao diện J-Link dựa trên công cụ SEGGER J-Link Commander (JLinkExe) phải được cài đặt riêng trên máy chủ.

Giao diện ESP32 dựa trên lệnh esptool.py của Espressif. Lệnh này được cung cấp dưới dạng một phần của SDK ESP-IDF của Espressif.

Các loại thông tin có thể được cấp phép

Công cụ cấp phép nhà máy OpenWeave có thể cung cấp các loại thông tin sau đây:

  • Số sê-ri thiết bị
  • Mã thiết bị Weave do nhà sản xuất chỉ định
  • Chứng chỉ Weave và khóa riêng tư do nhà sản xuất chỉ định
  • Mã ghép nối
  • Số sửa đổi sản phẩm
  • Ngày sản xuất

Mặc dù thiết bị thường cần tất cả thông tin ở trên để hoạt động bình thường, nhưng bạn không bắt buộc phải cung cấp tất cả thông tin cùng một lúc. Do đó, việc cung cấp các loại thông tin khác nhau có thể xảy ra tại các điểm riêng biệt trong quá trình sản xuất. Ngoài ra, bạn có thể thay thế các giá trị được cung cấp trước đó bằng các giá trị mới trong bước cấp phép tiếp theo.

Nguồn thông tin cấp phép

Bạn có thể cung cấp thông tin cấp phép thiết bị cho Công cụ cấp phép nhà máy theo những cách sau:

  • Đối số của dòng lệnh
  • Sử dụng tệp CSV cung cấp
  • Bằng cách tìm nạp các giá trị từ máy chủ cấp phép Nest

Dòng lệnh

Ở dạng đơn giản nhất, thông tin cấp phép thiết bị được chỉ định trực tiếp trên dòng lệnh đến Công cụ cấp phép nhà máy OpenWeave. Ví dụ:

./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000001 \
    --pairing-code NESTUS --mfg-date 2019/04/01

Các giá trị dữ liệu nhị phân, chẳng hạn như chứng chỉ Weave và khóa riêng tư, có thể được chỉ định dưới dạng chuỗi base-64 hoặc là tên của các tệp chứa dữ liệu mong muốn ở dạng thô (nhị phân).

Dưới đây là danh sách đầy đủ các đối số dòng lệnh có sẵn.

Đang cung cấp tệp CSV

Để đáp ứng việc cấp phép hàng loạt thiết bị, Công cụ cấp phép nhà máy cũng có thể đọc dữ liệu cấp phép từ tệp dữ liệu cấp phép theo định dạng CSV. Các cột của tệp này dự kiến sẽ tương ứng với các loại dữ liệu cấp phép cụ thể – tức là Serial_Num, Certificate, Private_Key và các loại khác. Các hàng trong tệp cung cấp giá trị riêng cho các thiết bị cụ thể, được lập chỉ mục theo Weave id id (Device_Id). Id của thiết bị cụ thể cần cung cấp phải được chỉ định trên dòng lệnh. Ví dụ:

./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000001 \
    --prov-csv-file ./dev-provisioning-data.csv

Các cột CSV sau đây được hỗ trợ:

Tên Định dạng Mô tả
Device_Id 16 chữ số hex Id thiết bị dệt. Phải có.
Serial_Num string Số sê-ri của thiết bị.
Certificate chuỗi base-64 Chứng nhận thiết bị Weave do nhà sản xuất chỉ định.
Private_Key chuỗi base-64 Khóa riêng do nhà sản xuất chỉ định.
Pairing_Code string Mã ghép nối.
Product_Rev số nguyên Số sửa đổi sản phẩm.
Mfg_Date YYYY/MM/DD Ngày sản xuất thiết bị.

Các cột có thể xuất hiện trong tệp CSV theo thứ tự bất kỳ. Mọi cột đều không bắt buộc, ngoại trừ Device_Id. Mọi giá trị không có trong tệp CSV sẽ không được cấp phép trên thiết bị.

Người dùng có thể chỉ định riêng các giá trị cấp phép trên dòng lệnh ngoài tệp CSV. Trong trường hợp đó, giá trị dòng lệnh lấy trước các giá trị trong tệp.

Định dạng tệp CSV mà Công cụ Cấp phép Nhà máy hỗ trợ tương thích với kết quả của lệnh gen-provisioning-data của công cụ weave.

Máy chủ cấp phép Nest

Công cụ cấp phép nhà máy hỗ trợ tìm nạp thông tin cấp phép chọn lọc từ máy chủ cấp phép Nest bằng giao thức dựa trên HTTPS. Giao thức máy chủ cấp phép có thể được dùng để tìm nạp chứng chỉ thiết bị Weave do nhà sản xuất chỉ định, khóa riêng tư tương ứng và Mã ghép nối Weave từ máy chủ cấp phép.

Vị trí mạng của máy chủ cấp phép được chỉ định bằng cách cung cấp một URL cơ sở trên dòng lệnh của công cụ cấp phép. Thông tin cấp phép mong muốn được chọn bằng cách chỉ định mã thiết bị Weave trên dòng lệnh. Ví dụ:

./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000001 \
    --prov-server https://192.168.172.2:8000/

Người dùng có thể chỉ định từng giá trị cấp phép trên dòng lệnh cùng với URL máy chủ cấp phép. Trong trường hợp này, các giá trị đưa ra trên dòng lệnh sẽ ưu tiên giá trị do máy chủ trả về.

Bật / tắt tính năng hỗ trợ cấp phép về trạng thái ban đầu

Việc hỗ trợ cấp phép về trạng thái ban đầu của OpenWeave trong chương trình cơ sở của thiết bị được kiểm soát trong tuỳ chọn cấu hình thời gian biên dịch WEAVE_DEVICE_CONFIG_ENABLE_FACTORY_PROVISIONING. Tùy chọn này được bật theo mặc định. Bạn có thể tắt tính năng này bằng cách ghi đè tùy chọn trong tệp WeaveProjectConfig.h của ứng dụng. Ví dụ:

#define WEAVE_DEVICE_CONFIG_ENABLE_FACTORY_PROVISIONING 0

Nhìn chung, bạn có thể yên tâm bật tùy chọn cấp phép về trạng thái ban đầu trong chương trình cơ sở của thiết bị sản xuất miễn là giao diện gỡ lỗi của thiết bị bị tắt đúng cách trên các thiết bị sản xuất. Bạn có thể thực hiện việc này thông qua các phương thức phần cứng (ví dụ: bằng cách thổi cầu chì trong SoC) hoặc trong phần mềm (ví dụ: thông qua một trình tải khởi động an toàn chặn quyền truy cập gỡ lỗi trong quá trình khởi động).

Chạy công cụ cấp phép nhà máy

Công cụ cấp phép nhà máy OpenWeave hỗ trợ các tùy chọn dòng lệnh sau:

Lựa chọn Mô tả
--target <string> Loại thiết bị mục tiêu. Các lựa chọn là: nrf52840, esp32
--load-addr <hex-chữ số> Địa chỉ trong bộ nhớ thiết bị mà tại đó dữ liệu cấp phép sẽ được ghi.
--chi tiết, -v Điều chỉnh mức độ chi tiết đầu ra. Sử dụng nhiều đối số để tăng độ chi tiết.
--serial-num <string> Đặt số sê-ri của thiết bị.
--device-id <hex-chữ số> Đặt mã thiết bị do nhà sản xuất chỉ định.
--device-cert <base-64> | <file-name> Đặt chứng chỉ thiết bị Weave do nhà sản xuất chỉ định.
--device-key <base-64> | <file-name> Đặt khóa riêng tư cho thiết bị Weave do nhà sản xuất chỉ định.
--pairing-code <string> Đặt mã ghép nối thiết bị.
--product-rev <integer> Thiết lập bản sửa đổi sản phẩm cho thiết bị.
--mfg-date <YYYY/MM/DD> | hôm nay | ngay Đặt ngày sản xuất thiết bị.
--jlink-cmd <path-name> Đường dẫn đến lệnh JLink. Giá trị mặc định là & # 39; JLinkExe\39 ..
--jlink-if SWD | JTAG ( Loại giao diện J-Link. Giá trị mặc định là SWD.
--jlink-speed <integer> | thích ứng | tự động Tốc độ giao diện J-Link.
--jlink-sn <string> Số sê-ri J-Link.
--esptool-cmd <path-name> Đường dẫn đến lệnh esptool. Giá trị mặc định là & # 39; esptool.py\39;.
--port <path-name> Tên thiết bị cổng COM cho ESP32. Giá trị mặc định là /tty/USB0.
--speed <integer> Tốc độ truyền cho cổng COM. Giá trị mặc định là 115200.
--prov-csv-file <file-name> Đọc dữ liệu cấp phép thiết bị từ tệp CSV cung cấp.
--prov-server <url> Đọc dữ liệu cấp phép thiết bị từ máy chủ cấp phép.
--disable-server-authation Khi sử dụng HTTPS, hãy tắt tính năng xác thực chứng chỉ do máy chủ cấp phép cung cấp.

Ví dụ

Lệnh sau đặt mã thiết bị, số sê-ri, bản sửa đổi sản phẩm và mã ghép nối thành các giá trị cụ thể. Ngày sản xuất được đặt thành ngày hiện tại. Và chứng chỉ thiết bị và khóa riêng tư được đặt để kiểm tra các giá trị đã cho trong tệp CSV được cung cấp cùng với kho lưu trữ nguồn openweave-core.

./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000042 \
    --serial-num JAYS_DEVICE_42 --product-rev 1 --pairing-code NESTUS --mfg-date today \
    --prov-csv-file ~/projects/openweave-core/certs/development/device/test-dev-provisioning-data.csv