GitHub에서 소스 보기 |
OpenWeave Factory Provisioning Tool은 Weave 지원 기기에 지속적인 기기별 구성 정보를 프로비저닝하는 편리한 수단을 제공합니다. 공장 프로비저닝 도구는 고객에게 발송하기 전에 고유한 ID 및 사용자 인증 정보로 개별 기기를 스탬프하는 제조 라인 프로세스의 일부로 사용하도록 설계되었습니다. 개발자가 개발 프로세스 중에 사용되는 사전 제작 하드웨어를 맞춤설정하는 데도 사용할 수 있습니다.
작동 원리
OpenWeave 공장 프로비저닝 도구의 목표는 기기의 영구 구성 저장소에 선택한 구성 정보를 삽입하여 기기 펌웨어가 런타임에 이를 선택하여 사용할 수 있도록 하는 것입니다. 영구 기기 구성은 일반적으로 기기의 내부 플래시 내에 저장되지만 데이터가 저장되는 정확한 방식과 형식은 플랫폼마다 다릅니다. 공장 프로비저닝 도구 자체는 최종 저장소 형식과 독립적이며 기기 펌웨어의 코드를 사용하여 데이터를 올바르게 씁니다. 또한 이 도구의 사용자 인터페이스는 구성 중인 하드웨어 유형과 거의 독립적입니다. 즉, 서로 다른 하드웨어 플랫폼을 기반으로 하는 제품 라인 전반에서 유사한 제조 프로세스를 사용할 수 있습니다.
공장 출고 시 프로비저닝 도구는 일종의 디버그 또는 제어 인터페이스(예: JTAG 또는 SWD 포트)를 통해 대상 기기에 연결된 호스트 머신에서 실행되도록 설계된 작업입니다. 이 도구는 특별하게 인코딩된 형식으로 기기의 RAM에 프로비저닝 정보를 삽입합니다. 그런 다음 기기를 다시 시작하라는 안내를 받습니다. 그러면 기기 펌웨어에 내장된 코드가 인코딩된 데이터를 찾아서 무결성을 확인하고 포함된 값을 플랫폼에 적합한 형식으로 영구 저장소에 씁니다.
삽입된 프로비저닝 데이터를 감지하고 처리하는 기기 내 코드는 OpenWeave 기기 레이어에 내장되어 있으며 지원되는 모든 플랫폼에서 사용 설정할 수 있습니다. 사용 설정되면 기기가 부팅될 때마다 기기 초기화 프로세스의 초기 단계에서 코드가 자동으로 실행됩니다. 이 코드는 RAM의 플랫폼별 영역을 스캔하여 작동합니다. 메모리가 적은 플랫폼 (예: 1MB 미만)에서는 스캔이 사용 가능한 모든 RAM을 포함합니다.
프로비저닝 데이터는 RAM에 배치될 때 쉽게 식별할 수 있는 접두사로 인코딩되므로 스캔 프로세스 중에 빠르게 찾을 수 있습니다. 암호화 해시를 기반으로 하는 무결성 검사 값은 처리하기 전에 데이터의 유효성을 확인하는 데 사용됩니다.
기본적으로 프로비저닝 도구는 대상 기기 플랫폼을 기반으로 프로비저닝 데이터를 삽입할 RAM 위치를 선택합니다. 이 선택사항은 도구의 인수를 통해 재정의할 수 있습니다. 일반적으로 기기 펌웨어는 프로비저닝 데이터를 수신하기 위해 RAM 위치를 예약할 필요가 없습니다. 일반적으로 프로비저닝 데이터는 다른 용도로 할당되었지만 일반적으로 기기 부팅 프로세스 초기에 사용되지 않는 RAM 위치에 기록됩니다. 일반적인 선택은 초기 시스템 스택의 맨 위 또는 힙 영역의 맨 끝입니다.
공장 프로비저닝 도구는 일련의 외부 개발 도구를 사용하여 대상 기기에 인터페이스합니다. 사용되는 특정 도구는 대상 기기의 유형에 따라 다릅니다. 현재 두 가지 기기 인터페이스가 지원됩니다.
- 기기의 JTAG 또는 SWD 포트에 연결된 SEGGER J-Link 디버그 프로브
- Espressif ESP32에 연결된 USB 직렬 포트
J-Link 인터페이스는 SEGGER J-Link Commander 도구 (JLinkExe)를 사용하며, 이 도구는 호스트 머신에 별도로 설치해야 합니다.
ESP32 인터페이스는 Espressif의 ESP-IDF SDK의 일부로 제공되는 Espressif esptool.py 명령어를 사용합니다.
프로비저닝할 수 있는 정보 유형
OpenWeave Factory 프로비저닝 도구는 다음 유형의 정보를 프로비저닝할 수 있습니다.
- 기기 일련번호
- 제조업체가 할당한 Weave 기기 ID
- 제조업체가 할당한 Weave 인증서 및 비공개 키
- Weave 페어링 코드
- 제품 버전 번호
- 제조일
일반적으로 기기가 제대로 작동하려면 위의 모든 정보가 필요하지만 모든 정보를 동시에 프로비저닝할 필요는 없습니다. 따라서 제조 프로세스의 여러 지점에서 다양한 유형의 정보가 프로비저닝될 수 있습니다. 또한 후속 프로비저닝 단계에서 이전에 프로비저닝된 값을 새 값으로 대체할 수 있습니다.
프로비저닝 정보 소스
기기 프로비저닝 정보는 다음과 같은 방법으로 공장 프로비저닝 도구에 제공할 수 있습니다.
- 명령줄 인수
- 프로비저닝 CSV 파일 사용
- Nest 프로비저닝 서버에서 값 가져오기
명령줄
가장 간단한 형태로 기기 프로비저닝 정보는 OpenWeave Factory Provisioning Tool의 명령줄에 직접 지정됩니다. 예를 들면 다음과 같습니다.
./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000001 \
--pairing-code NESTUS --mfg-date 2019/04/01
Weave 인증서 및 비공개 키와 같은 바이너리 데이터 값은 base-64 문자열로 지정하거나 원시 (바이너리) 형식의 원하는 데이터가 포함된 파일 이름으로 지정할 수 있습니다.
사용 가능한 명령줄 인수의 전체 목록은 아래를 참조하세요.
CSV 파일 프로비저닝
기기의 일괄 프로비저닝을 지원하기 위해 공장 프로비저닝 도구는 CSV 형식의 프로비저닝 데이터 파일에서 프로비저닝 데이터를 읽을 수도 있습니다. 이 파일의 열은 특정 프로비저닝 데이터 유형(예: Serial_Num
, Certificate
, Private_Key
등)에 해당합니다. 파일의 행은 Weave 기기 ID(Device_Id
)로 색인이 생성된 특정 기기의 개별 값을 제공합니다. 프로비저닝할 특정 기기의 ID는 명령줄에 지정해야 합니다. 예를 들면 다음과 같습니다.
./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000001 \
--prov-csv-file ./dev-provisioning-data.csv
다음 CSV 열이 지원됩니다.
이름 | 형식 | 설명 |
---|---|---|
Device_Id |
16자리 16진수 | Weave 기기 ID입니다. 필수 입력란입니다. |
Serial_Num |
문자열 | 기기 일련번호입니다. |
Certificate |
base-64 문자열 | 제조업체가 할당한 Weave 기기 인증서입니다. |
Private_Key |
base-64 문자열 | 제조업체가 할당한 Weave 비공개 키입니다. |
Pairing_Code |
문자열 | Weave 페어링 코드. |
Product_Rev |
정수 | 제품 버전 번호입니다. |
Mfg_Date |
YYYY/MM/DD | 기기 제조일입니다. |
열은 CSV 파일에 어떤 순서로든 표시될 수 있습니다. Device_Id
를 제외한 모든 열은 선택사항입니다. CSV 파일에 없는 값은 기기에서 프로비저닝되지 않습니다.
사용자는 CSV 파일 외에 명령줄에서 개별 프로비저닝 값을 지정할 수 있으며, 이 경우 명령줄 값이 파일의 값보다 우선 적용됩니다.
공장 프로비저닝 도구의 CSV 파일 형식 지원은 weave
도구의 gen-provisioning-data
명령어 출력과 호환됩니다.
Nest 프로비저닝 서버
공장 프로비저닝 도구는 HTTPS 기반 프로토콜을 사용하여 Nest 프로비저닝 서버에서 선택한 프로비저닝 정보를 가져오는 기능을 지원합니다. 프로비저닝 서버 프로토콜은 프로비저닝 서버에서 제조업체가 할당한 Weave 기기 인증서, 이에 상응하는 비공개 키, Weave 페어링 코드를 가져오는 데 사용할 수 있습니다.
프로비저닝 서버의 네트워크 위치는 프로비저닝 도구 명령줄에 기본 URL을 제공하여 지정됩니다. 명령줄에서 Weave 기기 ID를 지정하여 원하는 프로비저닝 정보를 선택합니다. 예를 들면 다음과 같습니다.
./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000001 \
--prov-server https://192.168.172.2:8000/
사용자는 프로비저닝 서버 URL 외에도 명령줄에서 개별 프로비저닝 값을 지정할 수 있습니다. 이 경우 명령줄에 지정된 값이 서버에서 반환한 값보다 우선 적용됩니다.
초기화 프로비저닝 지원 사용 설정 / 중지
기기 펌웨어의 OpenWeave 공장 프로비저닝 지원은 WEAVE_DEVICE_CONFIG_ENABLE_FACTORY_PROVISIONING
컴파일 시간 구성 옵션으로 제어됩니다. 이 옵션은 기본적으로 사용 설정되어 있습니다. 이 기능은 애플리케이션의 WeaveProjectConfig.h
파일에서 옵션을 재정의하여 사용 중지할 수 있습니다. 예를 들면 다음과 같습니다.
#define WEAVE_DEVICE_CONFIG_ENABLE_FACTORY_PROVISIONING 0
일반적으로 프로덕션 기기에서 기기 디버그 인터페이스가 적절하게 사용 중지된 경우 프로덕션 기기 펌웨어에서 초기 프로비저닝을 사용 설정해도 안전합니다. 이는 하드웨어 수단 (예: SoC의 퓨즈를 끊는 방법) 또는 소프트웨어 수단 (예: 부팅 프로세스의 일부로 디버그 액세스를 차단하는 보안 부팅 로더를 통해)을 통해 달성할 수 있습니다.
팩토리 프로비저닝 도구 실행
OpenWeave Factory 프로비저닝 도구는 다음 명령줄 옵션을 지원합니다.
옵션 | 설명 |
---|---|
--target <string> | 대상 기기 유형입니다. nrf52840, esp32 중에서 선택할 수 있습니다. |
--load-addr <hex-digits> | 프로비저닝 데이터가 쓰여질 기기 메모리의 주소입니다. |
--verbose, -v | 출력 상세 수준을 조정합니다. 여러 인수를 사용하여 상세 출력을 높입니다. |
--serial-num <string> | 기기 일련번호를 설정합니다. |
--device-id <hex-digits> | 제조업체가 할당한 기기 ID를 설정합니다. |
--device-cert <base-64> | <file-name> | 제조업체가 할당한 Weave 기기 인증서를 설정합니다. |
--device-key <base-64> | <file-name> | 제조업체가 할당한 Weave 기기 비공개 키를 설정합니다. |
--pairing-code <string> | 기기 페어링 코드를 설정합니다. |
--product-rev <integer> | 기기의 제품 버전을 설정합니다. |
--mfg-date <YYYY/MM/DD> | 오늘 | 지금 | 기기의 제조일자를 설정합니다. |
--jlink-cmd <path-name> | JLink 명령어의 경로입니다. 기본값은 'JLinkExe'입니다. |
--jlink-if SWD | JTAG | J-Link 인터페이스 유형입니다. 기본값은 SWD입니다. |
--jlink-speed <integer> | adaptive | auto | J-Link 인터페이스 속도입니다. |
--jlink-sn <string> | J-Link 프로브 일련번호입니다. |
--esptool-cmd <path-name> | esptool 명령어의 경로 기본값은 'esptool.py'입니다. |
--포트 <path-name> | ESP32의 COM 포트 기기 이름입니다. 기본값은 /tty/USB0입니다. |
--speed <integer> | COM 포트의 보드율입니다. 기본값은 115200입니다. |
--prov-csv-file <file-name> | 프로비저닝 CSV 파일에서 기기 프로비저닝 데이터를 읽습니다. |
--prov-server <url> | 프로비저닝 서버에서 기기 프로비저닝 데이터를 읽습니다. |
--disable-server-validation | HTTPS를 사용하는 경우 프로비저닝 서버에서 제공한 인증서의 유효성 검사를 사용 중지합니다. |
예
다음 명령어는 기기 ID, 일련번호, 제품 버전, 페어링 코드를 특정 값으로 설정합니다. 제조일은 현재 날짜로 설정됩니다. 기기 인증서와 비공개 키는 openweave-core
소스 저장소와 함께 제공된 CSV 파일에 지정된 테스트 값으로 설정됩니다.
./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