Xây dựng hệ thống Internet of Thing sử dụng nền tảng Google Cloud IoT Core (P2)

Google IoT Core sử dụng kết nối TLS1.2 cho tầng transport và  JWT cho tầng application để mã hóa và xác thực danh tính thiết bị. Điều này có nghĩa chúng ta cần phải tạo ra cặp khóa bất đối xứng Public keyPrivate key. Quy trình sử dụng cặp khóa như sau:

  • Thiết bị IoT (Client) sẽ sử dụng Private key để tạo phần signature cho JWT. Mã JWT này sẽ được đến Google IoT Core mỗi khi cần kết nối để chứng minh danh tính cho thiết bị.
  • Google IoT Core (Cloud) sẽ sử dụng Public key để giải mã và xác nhận danh tính của thiết bị.

Phần 2: Hướng dẫn tạo chứng chỉ cho thiết bị để kết nối với Google IoT Core

1. Hướng dẫn tạo Public/ Private Key

Google IoT Core hỗ trợ chúng ta hai thuật toán để sinh cặp public-private key là RSA và Elliptic Curve.  Để tạo cặp key này chúng ta sẽ sử dụng công cụ hỗ trợ dòng lệnh gcloud mà GCP đã cung cấp cho chúng ta. Tại giao diện Console, ở thanh công cụ phía trên ta nhấn vào biểu tượng có tên Activate Cloud Shell như hình bên dưới.

Giao diện Console sẽ trả về cho chúng ta cửa sổ dòng lệnh gcloud để tương tác với các nguồn tài nguyên trong GCP. 

Cách 1: Tạo cặp key sử dụng thuật toán RSA: 

Hai lệnh này sẽ tạo cho chúng ta 2 file:

  • rsa_private.pem: Chứa private key, được lưu trữ tại thiết bị IoT và dùng để mã hóa chuỗi JWT khi thực hiện kết nối đến GIC.
  • rsa_public.pem: Chứa public key, được lưu trữ tại dịch vụ Google IoT Core để giải mã JWT từ thiết bị IoT gửi lên nhằm xác thực danh tính thiết bị.

Cách 2: Tạo cặp key sử dụng thuật toán Eliptic Curve:

Hai lệnh này sẽ tạo cho chúng ta 2 file:

  • ec_private.pem:  Chứa private key, được lưu trữ tại thiết bị IoT và dùng để mã hóa chuỗi JWT khi thực hiện kết nối đến GIC.
  • ec_public.pem: Chứa public key, được lưu trữ tại dịch vụ Google IoT Core để giải mã JWT từ thiết bị IoT gửi lên nhằm xác thực danh tính thiết bị.

Để xem danh sách các file chúng ta vừa khởi tạo, tại cửa sổ dòng lệnh gcloud, chúng ta dùng lệnh ls

Để tải các file này về máy, tại cửa sổ dòng lệnh gcloud, chúng ta thao tác như hình bên dưới, sau đó điền tên file (bao gồm cả đuôi file) mà chúng muốn tải về máy.

VD: rsa_public.pem, ec_private.pem,…

Ở đây mình tải 2 file ec_private.pemec_public.pem về máy để tiện cho việc đọc file và tạo chuỗi JWT ở phần sau. Ngoài ra, các bạn còn có thể đọc trực tiếp nội dung file trên cửa sổ gcloud bằng lệnh catVD: cat ec_public.pem,…

2. Hướng dẫn tạo Json Web Token (JWT)

Khi thiết bị IoT kết nối đến GIC phải cung cấp thông tin để xác thực thiết bị thông qua chuỗi JWT, cụ thể sẽ được điền vào trường password khi kết nối đến MQTT bridge. Để tạo JWT thì chúng ta có thể sử dụng các thư viện có sẵn do Google cung cấp với những ngôn ngữ phổ biến như C++, Java, Python,… Ở đây thì mình sẽ không sử dụng các thư viện có sẵn này mà thay vào đó, mình sẽ tự tạo một chuỗi JWT thông qua tool online trên trang jwt.io, cách này sẽ giúp chúng ta nắm rõ hơn để tạo ra một chuỗi JWT thì cần những thông số gì.

Trong khuôn khổ bài hướng dẫn này mình sẽ không đi chi tiết vào lý thuyết chuỗi JWT mà sẽ hướng dẫn tổng quan cách sử dụng. JWT là một đối tượng JSON chứa các thông tin dữ liệu cần trao đổi giữa client-server, mục đích sử dụng JWT là bên nhận sẽ xác minh được dữ liệu nhận được có bị thay đổi, giả mạo hoặc xâm phạm trong quá trình truyền đi hay không. Bản chất của quá trình này là dữ liệu trước khi gửi đi sẽ được ký (hay mã hóa) bởi khóa bí mật và chỉ có thể được giải mã bởi khóa công khai tại phía nhận, sau đó thực hiện phép đối sánh để xác minh tính toàn vẹn dữ liệu.

Cụ thể, JWT là một chuỗi có định dạng gồm 3 phần: Header.Payload.Signature

Để có thể tạo ra một chuỗi JWT hợp lệ do Google IoT Core quy định, trong phần Decoded chúng ta khai báo các thông số tương ứng với 3 phần Header, Payload, Signature như sau.

Header: Đây là thành phần tiêu đề với trường “alg” là thuật toán mã hóa và trường “typ” xác định đối tượng là JWT.

Payload: Đây là thành phần nội dung chứa thông tin mà chúng ta muốn thiết bị IoT trao đổi với server. Google IoT Core yêu cầu chúng ta phải đặt vào phần này những trường sau:

  • aud”:  Project-ID của project mà chúng ta đang làm việc.
  • iat”  : Thời điểm chuỗi Json được tạo ra (Sử dụng định dạng timestamp).
  • exp” : Thời điểm chuỗi Json hết hạn (Sử dụng định dạng timestamp).

Signature: Đây là thành phần quan trọng được tạo ra bằng cách kết hợp 2 phần (Header + payload), rồi mã hóa bằng một giải thuật mã hóa nào đó, ở đây mình dùng ES256 nên sẽ sử dụng cặp public/private key để tạo ra signature. Các bạn lưu ý điền vào public/private key tương ứng đã tạo ở phần I.

Sau khi điền hết các thông số trên vào phần Decoded. Ở phần Encoded, chúng ta đã có một chuỗi JWT hoàn chỉnh. Chúng ta sẽ lưu chuỗi token này vào trong máy để sau này dễ dàng lấy ra sử dụng. 

Như vậy là chúng ta đã có thể tạo được cặp Public/ Private key và một chuỗi JWT hoàn chỉnh cho một thiết bị muốn kết nối tới dịch vụ Google IoT Core. Ở bài viết tiếp theo mình sẽ hướng dẫn các bạn cách kết nối MQTT Client đến Google IoT Core sử dụng chuỗi JWT đã tạo ở trên nhé.
Chúc các bạn thành công!

Nhóm TAPIT IoTs

Xem tiếp phần 3: Hướng dẫn đăng ký và kết nối thiết bị tới Google IoT Core

Xem thêm:  Tổng hợp hướng dẫn Internet of Things với NodeMCU ESP8266 và ESP32