Device-friendly TLS 1.3
โปรเจกต์นี้เป็นส่วนถัดไปในซีรีส์ที่สาธิตการใช้งานบริการการเข้ารหัสที่อ้างอิง SIM เพื่อปรับปรุงความปลอดภัยของอุปกรณ์ IoT
โปรเจกต์แรกได้สาธิตการเข้ารหัสข้อมูล telemetry ขณะส่งข้อความจากอุปกรณ์ IoT ไปยังเซิร์ฟเวอร์ นั่นคือ "TLS 1.3 for Arduino Nano".
โปรเจกต์ที่สอง "Zero Touch Provisioning based on TLS 1.3" มีวัตถุประสงค์เพื่อแสดงการ Deploy อุปกรณ์ หรืออีกนัยหนึ่งคือการกำหนดค่าอุปกรณ์เมื่อเปิดเครื่องครั้งแรก โปรเจกต์นี้ยังสาธิตการควบคุมอุปกรณ์อย่างปลอดภัยและถาวรโดยการร้องขอพารามิเตอร์ควบคุมจากเซิร์ฟเวอร์เป็นระยะๆ
ตอนนี้ฟังก์ชัน SIM interface ของทั้งสองโปรเจกต์ได้ถูกรวมเข้ากับไลบรารี PodEnoSim ซึ่งมีให้ใช้งานจาก Arduino Library Manager และช่วยให้นักพัฒนา IoT สามารถเริ่มต้นใช้งานเทคโนโลยีนี้ได้ง่ายขึ้น
ในการโหลดไลบรารี ให้ค้นหารายการ Tools จากเมนูหลักของ IDE แล้วเลือก Manage Libraries... ในช่องค้นหา พิมพ์ PodEnoSim แล้วกดปุ่ม Install.

ในระหว่างการติดตั้งไลบรารี คุณอาจถูกถามเกี่ยวกับ dependencies ที่ขาดหายไป

กดปุ่ม Install all เพื่อให้แน่ใจว่าทุกอย่างจะทำงานได้อย่างถูกต้อง
ไลบรารีนี้ได้รับการทดสอบบน microcontroller สองรุ่นที่แตกต่างกัน:
- SAMD21 พร้อม modem u-blox SARA-U201 (บอร์ด MKR GSM 1400)
- ATMega4809 พร้อม modem Sim7000E (บอร์ด Arduino Nano Every ที่มี Waveshare NB-IoT Hat).
ตัวอย่างถัดไปนี้มีให้สำหรับบอร์ดแต่ละชนิด:
- ส่งข้อมูลไปยังเซิร์ฟเวอร์ด้วยวิธีการที่ผ่านการยืนยันตัวตนและเข้ารหัส (
SIM2CloudEncryption-DHT22)
- รับค่า configuration หรือพารามิเตอร์ควบคุมจากเซิร์ฟเวอร์ด้วยวิธีการที่ผ่านการยืนยันตัวตนและเข้ารหัส (
ZeroTouchProvisioning-LEDExternal).
มีตัวอย่างเพิ่มเติมอีก 2 ตัวอย่างสำหรับบอร์ด MKR GSM 1400 ซึ่งช่วยให้สามารถสำรวจเทคโนโลยีได้โดยไม่ต้องมีฮาร์ดแวร์เพิ่มเติมใดๆ - เพียงแค่จำลองแหล่งข้อมูล (SIM2CloudEncryption) และควบคุมสถานะของ LED ในตัวจากเซิร์ฟเวอร์ (ZeroTouchProvisioning-LEDInternal).
มาดูตัวอย่างที่ง่ายที่สุดกัน - SIM2CloudEncryption. สิ่งที่คุณต้องการทั้งหมดในการทดสอบคือบอร์ด Arduino MKR GSM 1400 และ Pod ENO SIM.
ในการโหลดตัวอย่าง ให้ค้นหารายการ File จากเมนูหลักของ IDE แล้วเลือก Examples จากนั้นเลื่อนลงไปจนถึงส่วน ExamplesfromCustomLibraries แล้วค้นหาชื่อไลบรารี PodEnoSim. เลือก Arduino-MKR-GSM-1400 และ SIM2CloudEncryption คุณก็จะได้โค้ดตัวอย่างออกมา
โค้ดตัวอย่างจะจำลองข้อมูล "ที่ละเอียดอ่อน" (hardcoded) ที่คุณต้องส่งไปยังเซิร์ฟเวอร์ ซึ่งเป็นข้อความที่เข้ารหัสแบบ JSON: {"temperature":21.5} โดยถูกเข้ารหัสเป็นค่าคงที่ DATA_ITEM หากคุณต้องการเปลี่ยนแปลง โปรดอย่าลืมอัปเดตค่าคงที่ LEN_DATA ให้สอดคล้องกัน
ฟังก์ชัน setup() ประกอบด้วย 4 ขั้นตอนเพื่อเตรียมพร้อมสำหรับการส่งข้อมูล:
- method
init()ถูกเรียกใช้พร้อมพารามิเตอร์ MODEM_BAUD_RATE เพื่อเริ่มต้น serial interface ไปยัง modem;
- method
waitForModemStart()ถูกเรียกใช้เพื่อรอจนกว่า modem จะตอบสนองต่อคำสั่ง AT;
- method
waitForNetworkRegistration()ถูกเรียกใช้เพื่อรอจนกว่า modem จะสามารถเปิด data channel ไปยังเซิร์ฟเวอร์ได้;
- method
deviceIdSet()ใช้เพื่อระบุ SIM ด้วย unique device identifier.
ฟังก์ชัน loop() อาจมีโค้ดบางส่วนสำหรับการรับข้อมูลและการจัดรูปแบบ ส่วนที่น่าสนใจที่สุดคือการร้องขอเพื่อส่งข้อมูลที่เข้ารหัสไปยังเซิร์ฟเวอร์ซึ่งจะดูเรียบง่ายเหมือน
byte res = enosim.dataSend(dataBuffer, dataLength);
ดังนั้น คุณสามารถเสริมโปรเจกต์ของคุณด้วยการเข้ารหัส TLS1.3 โดยเพิ่มโค้ดเพียงหนึ่งบรรทัดใน main loop!
การควบคุมและการจำลอง
เครื่องมือ client แบบ open source ที่เขียนด้วย python3 สามารถใช้เพื่อควบคุม Pre-Shared keys, อัปโหลด device configurations และวิเคราะห์ข้อมูลที่อุปกรณ์ดาวน์โหลด นอกจากนี้ยังเปิดโอกาสให้จำลอง SIM sessions เพื่ออัปโหลดข้อมูลทดสอบและดาวน์โหลด configurations.
ในการติดตั้งเครื่องมือ ให้ clone repository enosim-cli แล้วรัน
cd enosim-cli
python3
ในการใช้เครื่องมือ คุณต้องขอ secrets ต่อไปนี้จาก Pod:
- TLSPROXY_KEYENC
- API_USER
- API_PASS
- SIM_KEY
วิธีที่ดีที่สุดในการใช้งานคือการนำ secrets ทั้งหมดไปไว้ในไฟล์ config.yml ในโฟลเดอร์ iotsim-cli.
DEVICE_ID ควรได้รับการกำหนดค่าล่วงหน้า สำหรับการจำลองอาจเป็นค่าใดก็ได้ แต่สำหรับการใช้งานจริง ค่าจะต้องไม่ซ้ำกันในอุปกรณ์ทั้งหมดที่คุณใช้
คุณสามารถจำลองอุปกรณ์ เช่น เซ็นเซอร์คาร์บอนไดออกไซด์ โดยการส่งข้อมูลด้วยคำสั่ง
python3 enosim-cli simulate stc -j '{"co2": 340}'
คุณจะได้รับข้อความต่อไปนี้
2021-06-30 13:03:13,093 - enosim - INFO - TLS1.3-PSK session established. Initialising operation.
2021-06-30 13:03:15,856 - enosim - INFO - b'{"co2":340,"iccid":"98xxxxxxxxxxxxxxxxxx","deviceid":"deb001deb002deb003"}'
บรรทัดสุดท้ายคือการตอบกลับจากเซิร์ฟเวอร์เพื่อยืนยันว่าได้รับข้อมูลอย่างถูกต้อง
ตอนนี้คุณสามารถรับข้อมูลจากเซิร์ฟเวอร์ได้
python3 enosim-cli device getdata
และดูการตอบกลับของเซิร์ฟเวอร์ดังนี้
2021-06-30 13:16:04,373 - enosim - INFO - [
{
"sim_attribute_update_id": 507,
"iccid": "89xxxxxxxxxxxxxxxx",
"deviceid": "deb001deb002deb003",
"createdAt": "2021-06-30",
"updatedAt": "2021-06-30",
"sim_attributes": [
{
"id": 679,
"sim_attribute_update_id": 507,
"key": "co2",
"value": "340",
"createdAt": "2021-06-30",
"updatedAt": "2021-06-30"
}
]
}
]
ThePSK ใน SIM และในเซิร์ฟเวอร์สามารถอัปเดตเป็นค่าที่ผู้ใช้กำหนดได้