กลับไปหน้ารวมไฟล์
zero-touch-provisioning-based-on-tls-13-020b90.md

โปรเจกต์นี้จะโชว์ให้เห็นโซลูชันความปลอดภัย IoT ของ Pod นั่นคือ SAFE2 applet ที่เอาไว้ใช้ดึงข้อมูลการตั้งค่า (Configuration) จากเซิร์ฟเวอร์บน Cloud อย่างปลอดภัยและผ่านการยืนยันตัวตน

SAFE2 applet นี้พัฒนาต่อยอดมาจากแนวคิด GSMA IoT SAFE อีกที ตัว applet ออกแบบมาให้ใช้กับอุปกรณ์ IoT ธรรมดาๆ หรือแบบที่ทรัพยากรจำกัด เพื่อสร้างการแลกเปลี่ยนข้อมูลสองทางกับเซิร์ฟเวอร์อย่างปลอดภัย

โซลูชันนี้เหมาะมากสำหรับการอัพเกรดระดับความปลอดภัยของโปรเจกต์ที่ติดตั้งไปแล้ว ซึ่งอาจไม่มีทรัพยากรฮาร์ดแวร์เหลือเฟือพอจะมาทำโปรโตคอลเข้ารหัสเอง

SAFE2

SAFE2 applet ที่อยู่ใน SIM นี่มันมีโปรโตคอล TLS 1.3 แบบ Pre Shared Key (PSK) ติดตั้งอยู่ข้างในเลย สิ่งที่เจ๋งคือ SIM ไม่ได้แค่เก็บตรรกะของโปรโตคอลเท่านั้น แต่ยังเก็บ Pre Shared Key (PSK) ที่เป็นรหัสเฉพาะของมันเองด้วย และสามารถอัพเดต PSK นี้ได้อย่างปลอดภัยผ่านคำสั่ง OTA อีกต่างหาก

SAFE2 deploying architecture

SIM ยังเก็บข้อมูลเชื่อมต่ออย่าง URL, endpoint และหมายเลขพอร์ตของเซิร์ฟเวอร์ (IoT platform) เอาไว้ด้วย

SIM จะเป็นคนจัดการทุกขั้นตอนของโปรโตคอลเองหมด ตั้งแต่การแปลงชื่อโดเมน (DNS resolving) ไปจนถึงการลองส่งคำขอซ้ำๆ จนกว่าจะถึงเซิร์ฟเวอร์

ถ้าอยากได้ข้อมูลการตั้งค่าจากเซิร์ฟเวอร์ผ่าน SAFE2 applet น้องๆ ต้องให้ Device Application ส่งคำสั่งเฉพาะไปที่ SIM ผ่าน Modem Middleware ซึ่งก็คือการใช้คำสั่ง AT พื้นฐานสำหรับเข้าถึง SIM นั่นเอง โดยคำสั่งที่ใช้คือ AT+CSIM

ขั้นแรกต้องเปิดช่องทางการสื่อสารเสริม (supplementary logical channel) ก่อนนะ จะได้ไม่ไปรบกวน session GSM ระหว่างโมเด็มกับ SIM ในช่องทางหลัก (base channel) จากนั้นก็เลือก applet ในช่องทางใหม่ แล้วส่งคำสั่งเฉพาะไปที่ applet เพื่อเริ่มต้นคำขอ HTTP GET ไปยังเซิร์ฟเวอร์

แต่ละคำขอ GET จะมี ICCID ของ SIM (รหัสประจำตัวการ์ด) และ DeviceID ที่ Device Application ต้องเตรียมส่งไปล่วงหน้าด้วย SIM จะสร้าง session TLS 1.3 ขึ้นมา แล้วส่งคำขอไปยังพร็อกซี่ในรูปแบบที่เข้ารหัสและยืนยันตัวตนแล้ว พร็อกซี่จะส่งต่อคำขอจาก SIM ไปยังเซิร์ฟเวอร์ และส่งคำตอบจากเซิร์ฟเวอร์กลับมาที่ SIM

Device Application ต้องคอยตรวจสอบสถานะของคำขอ (polling) และมารับข้อมูลเมื่อมันพร้อมใช้งาน สุดท้ายอย่าลืมปิดช่องทางการสื่อสารเสริมเพื่อนำกลับมาใช้ใหม่ด้วยล่ะ

Configuration data

ข้อมูลการตั้งค่าต้องถูกตั้งค่าผ่าน Luner IoT Suite ก่อน

ในการสร้าง configuration น้องต้องขอ access token โดยใช้ข้อมูลประจำตัว (credentials) ที่ได้มา

Device ID คือรหัสประจำตัวเฉพาะของบอร์ด Arduino MKR GSM 1400 ที่ใช้ โค้ดในสเก็ตช์จะมีส่วนสำหรับดึง Device ID นี้และส่งให้ SAFE2 applet

ICCID คือรหัสประจำตัวเฉพาะของ SIM การ์ดที่ใช้

ส่วน "Body" นี่คือข้อมูล configuration ที่จะถูกส่งจาก SIM ไปยังอุปกรณ์ในรูปแบบที่อ่านได้ (clear text) ความยาวต้องไม่เกิน 255 ตัวอักษร

Device Application ที่น้องเขียนต้องสามารถแยกวิเคราะห์ (parse) ข้อมูล configuration ที่ได้รับมาได้

Configuration to switch ON the alarm (LED)

Execution Log

ล็อกด้านล่างนี้แสดงให้เห็นเหตุการณ์การรับ configuration 2 ครั้ง หลังจากอุปกรณ์เริ่มทำงาน (23:36:58.376) โมเด็มรายงานสถานะการลงทะเบียนว่า "Registered in roaming" (23:37:05.412-23:37:14.656)

23:36:55.420 -> MKR AT
23:36:55.420 -> B58D51C5504D5257352E3120FF0D1338
23:36:55.420 -> at
23:36:55.818 -> at
23:36:56.216 -> at
23:36:56.615 -> at
23:36:57.015 -> at
23:36:57.413 -> at
23:36:57.811 -> at
23:36:58.210 -> at
23:36:58.309 -> AT
23:36:58.376 -> OK
23:36:59.205 -> at+creg?
23:36:59.238 -> 0:0
23:36:59.238 -> cntr: 0
23:37:00.766 -> at+creg?
23:37:00.799 -> 0:0
23:37:00.799 -> cntr: 0
23:37:02.292 -> at+creg?
23:37:02.325 -> 0:0
23:37:02.325 -> cntr: 0
23:37:03.818 -> at+creg?
23:37:03.885 -> 0:0
23:37:03.885 -> cntr: 0
23:37:05.379 -> at+creg?
23:37:05.412 -> 0:5
23:37:05.412 -> cntr: 1
23:37:06.915 -> at+creg?
23:37:06.948 -> 0:5
23:37:06.948 -> cntr: 2
23:37:08.443 -> at+creg?
23:37:08.510 -> 0:5
23:37:08.510 -> cntr: 3
23:37:10.004 -> at+creg?
23:37:10.038 -> 0:5
23:37:10.038 -> cntr: 4
23:37:11.532 -> at+creg?
23:37:11.566 -> 0:5
23:37:11.566 -> cntr: 5
23:37:13.094 -> at+creg?
23:37:13.127 -> 0:5
23:37:13.127 -> cntr: 6
23:37:14.622 -> at+creg?
23:37:14.656 -> 0:5
23:37:14.656 -> cntr: 7
23:37:15.651 -> setup finished

Device ID B58D51C5504D5257352E3120FF0D1338 ถูกส่งไปยัง SIM (23:37:16.017) และ Device Application ส่งคำขอข้อมูล configuration (23:37:17.346)

23:37:15.751 -> at+csim=10,"0070000001"
23:37:15.751 -> +CSIM: 6,"019000"
23:37:15.751 ->
23:37:15.751 -> OK
23:37:15.884 -> at+csim=34,"01A4040C0CF0706F646773616665320101"
23:37:15.884 -> +CSIM: 4,"9000"
23:37:15.884 ->
23:37:15.884 -> OK
23:37:16.017 -> at+csim=42,"01DA02C010B58D51C5504D5257352E3120FF0D1338"
23:37:16.017 -> +CSIM: 4,"9000"
23:37:16.017 ->
23:37:16.017 -> OK
23:37:16.083 -> at+csim=10,"0070800100"
23:37:16.083 -> +CSIM: 4,"9000"
23:37:16.083 ->
23:37:16.083 -> OK
23:37:16.083 -> Set Device ID: OK
23:37:16.183 -> at+csim=10,"0070000001"
23:37:16.183 -> +CSIM: 6,"019000"
23:37:16.183 ->
23:37:16.183 -> OK
23:37:16.316 -> at+csim=34,"01A4040C0CF0706F646773616665320101"
23:37:16.316 -> +CSIM: 4,"9000"
23:37:16.316 ->
23:37:16.316 -> OK
23:37:17.346 -> at+csim=10,"01CA000000"
23:37:17.346 -> +CSIM: 516,"6467736166653

จากนั้น Device Application ก็คอยตรวจสอบสถานะของ SAFE2 applet ทุก 15 วินาที (23:37:32.429, 23:37:47.512, 23:38:17.672)

23:37:32.429 -> at+csim=10,"01CC020000"
23:37:32.429 -> +CSIM: 12,"000100009000"
23:37:32.429 ->
23:37:32.429 -> OK
23:37:32.429 -> receiving state: 1
23:37:47.512 -> at+csim=10,"01CC020000"
23:37:47.512 -> +CSIM: 12,"000100009000"
23:37:47.512 ->
23:37:47.512 -> OK
23:37:47.512 -> receiving state: 1
23:38:02.594 -> at+csim=10,"01CC020000"
23:38:02.594 -> +CSIM: 12,"000100009000"
23:38:02.594 ->
23:38:02.594 -> OK
23:38:02.594 -> receiving state: 1
23:38:17.672 -> at+csim=10,"01CC020000"
23:38:17.672 -> +CSIM: 12,"000700009000"
23:38:17.672 ->
23:38:17.672 -> OK
23:38:17.672 -> receiving state: 7

ทันทีที่สถานะกลายเป็น "Data Available" Device Application ก็ส่งคำขอรับข้อมูล (23:38:17.938), ได้ข้อมูลกลับมา (23:38:17.938) และถอดรหัสข้อมูล JSON ที่ได้ จากนั้นก็นำ configuration ไปใช้ ซึ่งในที่นี้คือสั่งให้ LED ติด

23:38:17.938 -> at+csim=10,"01CA010000"
23:38:17.938 -> +CSIM: 184,"7B22636F6E66696775726174696F6E223A7B2276657273696F6E223A22323032312D30352D3035222C22636F6E666967223A5B7B22616374696F6E223A22696F743A416C61726D222C22656666656374223A224F6E227D5D7D7D9000"
23:38:17.938 ->
23:38:17.938 -> OK
23:38:17.938 -> received:90
23:38:17.938 -> {"configuration":{"version":"2021-05-05","config":[{"action":"iot:Alarm","effect":"On"}]}}
23:38:17.938 -> configuration version: 2021-05-05
23:38:17.938 -> iot:Alarm configured as ON

หลังจากปิดช่องทางการสื่อสารเสริม (23:38:18.004) Device Application ก็เริ่มรอ และในอีก 5 นาทีต่อมา (23:43:17.836) ก็เริ่มลูปถัดไป ในระหว่างที่รออยู่นั้น configuration บนเซิร์ฟเวอร์ถูกอัพเดตให้ปิดการแจ้งเตือน (LED) แล้ว

23:38:18.004 -> at+csim=10,"0070800100"
23:38:18.004 -> +CSIM: 4,"9000"
23:38:18.004 ->
23:38:18.004 -> OK
23:38:18.004 -> waiting.....
23:43:17.836 -> at+csim=10,"0070000001"
23:43:17.836 -> +CSIM: 6,"019000"
23:43:17.836 ->
23:43:17.836 -> OK
23:43:17.970 -> at+csim=34,"01A4040C0CF0706F646773616665320101"
23:43:17.970 -> +CSIM: 4,"9000"
23:43:17.970 ->
23:43:17.970 -> OK

Device Application ส่งคำขอข้อมูล configuration อีกครั้ง (23:43:19.034) และหลังจากตรวจสอบสถานะครั้งแรก (23:43:34.102) ก็ได้รับคำตอบว่า "Data available" การประมวลผลในลูปที่สองนี้เร็วกว่า เพราะ URL ถูกแปลงชื่อโดเมนและเก็บไว้ในแคชของ SAFE2 applet แล้ว

Device Application ได้รับข้อมูล configuration ที่ 23:43:34.368

คราวนี้ configuration มีค่า "effect":"Off" ทำให้ LED ถูกปิด

หลังจากได้รับข้อมูล configuration แล้ว ช่องทางการสื่อสารเสริมก็ถูกปิด และเริ่มการรอรอบถัดไปที่ 23:43:34.435

23:43:19.034 -> at+csim=10,"01CA000000"
23:43:19.034 -> +CSIM: 516,"6467736166653
23:43:34.102 -> at+cs

ข้อมูล Frontmatter ดั้งเดิม

title: "Zero Touch Provisioning Based on TLS 1.3"
description: "Device configuration from the cloud with TLS 1.3 security."
author: "kostiantynchertov"
category: "Internet of Things, BT & Wireless"
tags:
  - "zero touch provisioning"
  - "security"
  - "internet of things"
views: 2716
likes: 1
price: 1499
difficulty: "Intermediate"
components:
  - "1x LED 10mm"
  - "1x Resistor 220 Ohm"
  - "1x Arduino IDE"
  - "1x Arduino MKR GSM 1400"
  - "1x Luner IoT SIM"
tools: []
apps:
  - "1x Luner IoT Suite"
downloadableFiles: []
documentationLinks: []
passwordHash: "6dbc32509cf893dc31ad9558001abe985c3eb442393d32feb22e9cacd519d381"
encryptedPayload: "U2FsdGVkX1+41+wT4yo1mXy3qJ1hJ4tkGcjBmBem9IEJYW+QMF6+48H7k8OyGGivEoPlKWAdMUxlrYmvpOIHHh9Hb7WIIToyBFzCoVphnek="
seoDescription: "Implement Zero Touch Provisioning for Device configuration from the Cloud with TLS 1.3 security."
videoLinks: []
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/zero-touch-provisioning-based-on-tls-13-020b90_cover.jpg"
lang: "th"