บทเรียน 5.1 — ลงทะเบียนด้วย CSR

สร้างคำขอใบรับรองจากกุญแจในชิป ส่งให้แพลตฟอร์ม และติดตามคำขอจนได้ใบรับรอง

โมดูล 5 — การลงทะเบียนอุปกรณ์อย่างปลอดภัย

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

เป้าหมาย

เมื่อจบบทเรียนนี้ คุณจะ

  1. อธิบายเนื้อหาของ CSR และเหตุผลที่กุญแจลับไม่ต้องออกจากชิป
  2. ติดตามคำขอด้วย correlation id และ OID ปลายทางตามตัวอย่างของ SDK
  3. ระบุสัญญาเรื่องบัฟเฟอร์ที่ฟังก์ชันส่ง CSR กำหนดให้ผู้เรียก
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ก่อนเริ่ม

  • เรียนมาก่อน: บทเรียน 4.2 และไฟล์ lab_key.pem จากแล็บ 1.2
  • บนคอมพิวเตอร์: openssl · บนบอร์ด: แม่แบบของ SDK ที่ build ได้แล้ว
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ดูของจริงก่อน

กด HSM Security → Enrol Certificate — จอขึ้นเจ็ดประโยคตามลำดับ

Connecting to the platform
Generating a key pair inside the secure element
Signing the request with the key that never leaves the chip
Sending the request to the platform
Waiting for the platform
Checking the certificate against the key in the chip
The device can prove it holds the key this certificate names

ทายก่อน ประโยคที่สามบอกว่ามีการ "ลงนามคำขอ" — ถ้าคำขอมีกุญแจสาธารณะอยู่แล้ว ทำไมยังต้องลงนามอีก และใครเป็นคนตรวจลายเซ็นนั้น

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด (1) — CSR คืออะไร และทำไมกุญแจลับไม่ต้องออกจากชิป

CSR (PKCS #10) มีสามส่วน: subject · กุญแจสาธารณะ · ลายเซ็น ที่ผู้ขอลงบนสองส่วนแรกด้วยกุญแจลับคู่กัน

คำตอบคำทาย: ลายเซ็นนี้คือ proof of possession — ผู้ออกใบตรวจด้วยกุญแจสาธารณะในคำขอ ถ้าผ่าน แปลว่าผู้ขอถือกุญแจลับของคู่นั้นจริง ผู้ออกใบไม่เคยต้องเห็นกุญแจลับเลย

1. สร้างคู่กุญแจในชิป แล้วสร้าง CSR แบบ PEM (consumer_must_provide.txt)
2. publish_csr() ห่อเป็น JSON publish ไปที่ device/<id>/commands/csr
3. แพลตฟอร์มลงนามตอบกลับที่ commands/certificate (ไม่มี manifest)
4. subscriber เขียนใบลงช่อง แล้วตรวจว่าใบเข้าคู่กับกุญแจในชิป
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด (2) — ติดตามคำขอด้วย correlation id และ OID

  • subscribe commands/# ก่อน publish CSR เสมอ คำตอบไม่ถูก retain — คำตอบที่มาก่อน subscription สำเร็จหายไปเลย
  • หัวข้อใช้ device_id เสมอ ไม่ใช่ UID ของ Trust M
  • CSR ที่ถูกปฏิเสธเงียบ ไม่มีอะไรตอบกลับ — CSR ต้องยาวกว่า 100 ไบต์

กับดักสำคัญ trustm_requested_target_oid()/anchor_oid() ถูกเขียนโดย tesaiot_publish_protected_update() เท่านั้น — หลังเรียก publish_csr() อย่างเดียว สองค่านี้จึงบอกเรื่องคำขอ PU ครั้งก่อน ไม่เคยบอกเรื่อง CSR นี้

trustm_reset_state() ล้าง correlation id — ถ้าเรียกตอนคำตอบยังไม่มา ใบรับรองที่มาถึงจะไม่มีอะไรให้จับคู่ และถูกทิ้ง

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด (3) — สัญญาเรื่องบัฟเฟอร์ของ publish_csr()

int publish_csr(uint8_t *csr, size_t csr_length, uint16_t target_oid,
                 uint16_t trust_anchor_oid, uint32_t payload_version);

พารามิเตอร์แรกเป็น uint8_t * ไม่ใช่ const — เพราะฟังก์ชันสร้าง JSON ทับลงในบัฟเฟอร์ของคุณ

  1. บัฟเฟอร์ต้องเขียนได้ — PEM แบบ const ใน flash จะทำให้ fault
  2. บัฟเฟอร์ต้องใหญ่กว่า CSR — CSR + ~45 ไบต์คงที่ + device id + correlation id (แนะนำเผื่อ 256 ไบต์)
  3. csr_length คือความยาวของ CSR ไม่ใช่ขนาดบัฟเฟอร์
  4. CSR หายไปเมื่อฟังก์ชันคืนค่า — ต้องเก็บสำเนาไว้ก่อนถ้าจะใช้อีก
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ตัวอย่างสมบูรณ์ — ปฏิเสธก่อนส่ง CSR ปลอม

/* Refuse rather than publish a fabricated CSR. A CSR the platform signs is
 * a certificate on a real device; the wrong one is worse than none. */
if (s_csr_len == 0u) {
    printf("  publish_csr() NOT called: s_csr is empty. Build a CSR first...\r\n");
    return SDK_EX_NO_DATA;
}
if (s_csr_len + 256u > sizeof(s_csr)) {
    printf("  publish_csr() NOT called: %u-byte CSR in a %u-byte buffer "
           "leaves no room for the JSON envelope\r\n",
           (unsigned)s_csr_len, (unsigned)sizeof(s_csr));
    return SDK_EX_REFUSED;
}

ตัวอย่างใช้บัฟเฟอร์ static ขนาด 1280 ไบต์ และทำความยาวเป็นศูนย์ทันทีหลังเรียก publish_csr()

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ฝึกเติม / แล็บ

ฝึกเติม ตัดสินว่า publish_csr() เรียกได้ไหม: CSR 620 ไบต์ในบัฟเฟอร์ 1280 → เรียกได้ (620+256=876≤1280) · บัฟเฟอร์เป็น const char[] → ต้องแก้ (เขียนไม่ได้) · csr_length = sizeof(buf) แทน 620 → ต้องแก้

แล็บหลัก build ตัวอย่าง 05 ไม่เปิด publish จดค่า correlation id/OID ที่พิมพ์ · สร้าง CSR บนคอมพิวเตอร์ด้วย UUID ปลอมที่เห็นชัดว่าปลอม ตรวจว่า self-signature verify OK · คำนวณขนาดบัฟเฟอร์ที่ต้องใช้ตามกฎ +256 ไบต์ แล้วลบไฟล์กุญแจทดลอง

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

เช็กความเข้าใจ

  1. ทำไมแพลตฟอร์มออกใบรับรองให้ได้โดยไม่ต้องเห็นกุญแจลับของอุปกรณ์

    • ก) เพราะแพลตฟอร์มเดากุญแจลับจากกุญแจสาธารณะได้ · ข) เพราะ CSR มีกุญแจสาธารณะ และลายเซ็นบน CSR พิสูจน์ว่าผู้ขอถือกุญแจลับคู่นั้น · ค) เพราะกุญแจลับถูกส่งไปแบบเข้ารหัส · ง) เพราะใบรับรองไม่เกี่ยวกับกุญแจ
  2. หลังเรียก publish_csr() อย่างเดียว trustm_requested_target_oid() บอกอะไร

    • ก) ช่องที่ใบรับรองจาก CSR นี้จะถูกเขียน · ข) OID ของคำขอ Protected Update ครั้งก่อน หรือค่าเริ่มต้น ไม่ได้บอกเรื่อง CSR นี้ · ค) UID ของชิป · ง) correlation id
  3. ข้อใดเป็นสัญญาเรื่องบัฟเฟอร์ของ publish_csr()

    • ก) บัฟเฟอร์เป็น const ได้ และ csr_length คือขนาดบัฟเฟอร์ · ข) บัฟเฟอร์ต้องเขียนได้ ใหญ่กว่า CSR csr_length คือความยาว CSR และ CSR หายไปหลังเรียก · ค) ฟังก์ชันจองบัฟเฟอร์ใหม่ให้เอง · ง) ต้องส่ง CSR แบบ DER เท่านั้น
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ไปต่อ

การลงทะเบียนใช้เวลาหลายวินาทีและต้องรอแพลตฟอร์มได้ถึงหนึ่งนาที บทต่อไปดูว่าหน้าจอบนอุปกรณ์รับมือกับงานยาวแบบนี้อย่างไรโดยไม่ค้างและไม่เงียบ

บทเรียนถัดไป: บทเรียน 5.2: หน้าจอลงทะเบียนบนอุปกรณ์

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แหล่งที่มาและเครดิต

"Secure IoT กับ OPTIGA™ Trust M" จาก TESA Open Knowledge โดยสมาคมสมองกลฝังตัวไทย
(Thai Embedded Systems Association: TESA) https://github.com/tesaiot/tesa-qualification-program
สัญญาอนุญาต CC BY-NC 4.0

โค้ดที่ยกในสไลด์นี้จาก TESAIoT PSE84 Dev Kit SDK (Apache-2.0) — ลิงก์และสัญญาอนุญาตอยู่ใน README ของบทเรียน

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0