Thanapon Tapala

Backend Developer

Embedded Developer

Smart Farmer

Maker

Thanapon Tapala

Backend Developer

Embedded Developer

Smart Farmer

Maker

Blog Post

ทำความเข้าใจ “MQTT with TLS” ใน AWS IoT Core สักหน่อย

March 5, 2023 Arduino, AWS, ESP32, MQTT
ทำความเข้าใจ “MQTT with TLS” ใน AWS IoT Core สักหน่อย

พอดีมีคำถามกับตัวเองว่า เอ๊ะ MQTT with TLS มันทำงานยังไงนะ แล้วทำไมตอนเชื่อมต่อ device เข้ากับ Message Broker จำเป็นต้องยัด Client certificate ลงไปด้วยนะ ก็เลยไปหาคำตอบมา ร่ายตั้งแต่ต้นเลยละกันนะ

เกริ่นก่อนนะ ปกติเราจะเข้ารหัสกันยังไง!!!

หลังจากไปทำการบ้านมาก็เข้าใจว่าปัจจุบันจะมีการเข้ารหัสอยู่ทั้งหมด 2 แบบด้วยกัน

ซึ่งแบบแรกเป็นการเข้ารหัสแบบ Symmetric Encryption หมายถึงการเข้ารหัสแบบทางเดียว คือเราใช้แค่ Secret key ชุดเดียวกันในการเข้ารหัส [Encrypt] และถอดรหัส [Decrypt]

ยกตัวอย่างเช่น “Token : akakleni192j5,ma” อะไรบลาๆ

Ref: https://en.wikipedia.org/wiki/Symmetric-key_algorithm

Asymmetric Encryption แปลตรงๆก็คือการเข้ารหัสแบบไม่สมมาตร ซึ่งหลักการทำงานคือ มีกุญแจอยู่ 2 ชุด ชุดแรกเอาไว้เข้ารหัส [Public Key] ส่วนกุญแจอีกดอกก็เอาไว้ถอดรหัส [Private Key] ซึ่งสุดท้ายแล้วเราจะเอา Public/Private Key นี้หล่ะไปคุยกันต่อในการทำ Digital Signature ซึ่งจะเอาไว้ใช้สำหรับการ Authenticate [Sign] และการ Verify ข้อมูลว่าเป็นข้อมูลของคนๆนี้จริงๆนะ ไม่ใช่ Attacker

Ref: https://www.okta.com/identity-101/asymmetric-encryption/

ที่มาของ SSL/TLS คือยังไงนะ

SSL/TLS ทั้งคู่ใช่ทั้ง Symmetric Encryption และ Asymmetric Encryption ในการส่งข้อมูลหากัน โดยที่จะใช้ Asymmetric Encryption ในการ Setup connection ระหว่าง Server <-> Client ส่วน Symmetric Encryption จะใช้ในการส่งข้อมูลหากันภายใน Secure Session

SSL ย่อมาจาก Secure Sockets Layer ซึ่งเป็น Protocol ที่ใช้สำหรับเข้ารหัสและป้องกันข้อมูลในขณะที่มีการส่งข้อมูลกันหากันผ่าน Internet

ส่วน TLS ก็คือ Transport Layer Security ซึ่งก็เป็น Protocol ตัวใหม่กว่าที่ถูกพัฒนามาจาก SSL ซึ่งเข้ามาแก้ไขเรื่อง Security ของ SSL อีกที

โดยที่ AWS IoT Core นั้นจะ Support TLS 1.2 และจะใช้ Server authentication หรือ Client authentication ก็ได้ แต่ถ้าใครอยากใช้วิธีแปลกๆ ก็ไปใช้ Custom Authentication เอาเด้อ

Server authentication กับ Client authentication ต่างกันยังไงนะ

Server authentication; User จะใช้ Public Key ที่ได้รับมาจาก Server ในการเข้ารหัส [Encrypt] ก่อนที่จะส่งข้อมูลไปยัง Server ส่วน Server ก็แค่ถอดรหัส [Decrypt] โดยใช้ Private Key ก็จบ ซึ่งวิธีนี้เราจะเก็บ Public Key ไว้ที่ Client เพื่อใช้ในการ Authen กันนะ

ในส่วนของ AWS IoT client authentication นั้น Client จะต้องเก็บ Private Key, Client Certificate ไว้กับตัวเพื่อใช้ในการ Authen ซึ่งจะต้องไป validate กับ AWS IoT Core อีกที่ โดยที่ Client Certificate นั้นจะเอาไว้สำหรับ verify ความถูกต้องระหว่าง Private Key กับ Public Key นั้นว่ามีความสอดคล้องกันหรือไม่ภายใน AWS IoT Core

สรุปก็คือ ถ้าให้เลือกใช้งาน MQTT with TLS แนะนำให้ใช้ Client Authenticate เพราะว่าจะมีความปลอดภัยมากซึ่งสามารถสรุปได้ดังนี้

  • เราสามารถ Verify และ Identity MQTT Client ที่เข้ามาต่อกับ Broker ได้
  • การ Authenticate MQTT Client จะเกิดขึ้น​ ณ Transport Layer ซึ่งถ้าหาก TLS Handshake ยังไม่สำเร็จ MQTT Client ก็ยังไม่สามารถ Connect และส่งข้อความมาที่ Broker ได้เลย

ซึ่งก็มี Overhead เหมือนกัน ในด้าน CPU และ Memory เองเพราะถ้าเป็นอุปกรณ์ Embedded system ตัวเล็กๆ ก็อาจจะรองรับไม่ไหวก็ได้นะ

TLS/SSL – MQTT Security Fundamentals

https://www.hivemq.com/blog/mqtt-security-fundamentals-tls-ssl/

X509 Client Certificate Authentication – MQTT Security Fundamentals

https://www.hivemq.com/blog/mqtt-security-fundamentals-x509-client-certificate-authentication/

Security in AWS IoT

https://www.hivemq.com/blog/mqtt-security-fundamentals-x509-client-certificate-authentication/
Taggs: