تأمين اتصالات إنترنت الأشياء: ربط nRF9160 Feather بخادم Mosquitto MQTT مستضاف ذاتياً

دقائق القراءة: 14

مقدمة: تحديات نقل البيانات في عالم إنترنت الأشياء

لطالما كانت عملية نقل البيانات بكفاءة وأمان تحدياً رئيسياً للمطورين في مجال إنترنت الأشياء (IoT). تتعدد التقنيات اللاسلكية والوسائط، وكذلك البروتوكولات المستخدمة. ولكن، بروتوكول واحد فرض هيمنته في عالم إنترنت الأشياء وهو MQTT.

على عكس خادم HTTP التقليدي، يتيح MQTT للأجهزة الاتصال، النشر (publish)، والاشتراك (subscribe) في مواضيع محددة (topics). يتم إرسال هذه المواضيع بعد ذلك إلى وسيط (broker) ليتم توزيعها على الأجهزة الأخرى المشتركة. والخبر السار هو أن دعم MQTT على لوحة Nordic nRF9160 ممتاز ومدعوم بشكل جيد.

في هذا الدليل المفصل، سنستعرض كيفية ربط لوحة nRF9160 Feather بخادم Mosquitto مستضاف ذاتياً. ستتعلم كيفية توليد شهادات الأمان الخاصة بك، وكيفية اختبار اتصالاتك لضمان أقصى درجات الأمان والفعالية. هل أنت مستعد للبدء؟ لننطلق!

اختيار بيئة الاستضافة لخادم Mosquitto

لاستضافة خادم Mosquitto، ستحتاج إلى خادم فعلي أو افتراضي. نظراً لأن Mosquitto مكتوب بلغة C، فإنه خفيف الوزن ويستهلك موارد قليلة، مما يجعله مثالياً للتثبيت على خادم افتراضي خاص (VPS) بميزانية محدودة دون قلق كبير. هنا يأتي دور مزودي خدمات VPS مثل Digital Ocean أو Vultr.

إعداد خادم افتراضي خاص (VPS) على Digital Ocean

لإعداد خادم جديد، اتبع الخطوات التالية:

  1. سجل الدخول إلى حسابك في Digital Ocean. (إذا لم يكن لديك حساب وترغب في دعمنا، يمكنك إنشاء حساب من هنا).
  2. أنشئ Droplet جديد.

إنشاء Droplet جديد على Digital Ocean

  1. اختر نظام التشغيل FreeBSD 12.1 مع نظام الملفات UFS.

اختيار FreeBSD 12.1 مع UFS

  1. اختر الخطة بسعر 5 دولارات؛ عادةً ما تكون كافية تماماً لاحتياجات Mosquitto.

اختيار خطة Droplet بسعر 5 دولارات

  1. تأكد من استيراد مفتاحك العام SSH public key. هذا سيمكنك من تسجيل الدخول بدون كلمة مرور فوراً.

استيراد مفتاح SSH العام

  1. اضغط على زر Create Droplet الأخضر لإنهاء الإعداد.

الضغط على زر إنشاء Droplet

خطوة إضافية هامة: ربط النطاق (Domain)

لكي تعمل الشهادات مع Mosquitto، ستحتاج إلى تعيين نطاق (domain) ليشير إلى عنوان IP الخاص بخادمك الافتراضي (VPS). يمكن تحقيق ذلك باستخدام سجل A record أو CNAME record. إذا كنت غير متأكد من كيفية القيام بذلك، يمكنك الرجوع إلى هذا الدليل. من الضروري تدوين النطاق (أو النطاق الفرعي) الذي استخدمته، حيث سنحتاجه لاحقاً.

تثبيت خادم Mosquitto MQTT

في هذا الدليل، سنركز على تشغيل لوحة nRF9160 Feather مع Mosquitto. يجب أن تكون جاهزاً الآن مع خادم Digital Ocean (أو ما شابه) يعمل بنظام FreeBSD. إذا لم تكن قد قمت بذلك بعد، يرجى العودة إلى قسم “اختيار بيئة الاستضافة”.

لتثبيت Mosquitto على خادمك الافتراضي (Droplet)، قم بتشغيل الأمر التالي:

$ pkg install mosquitto

إذا كنت تستخدم نظام تشغيل آخر غير FreeBSD، فقد يختلف هذا الأمر. على سبيل المثال، يعمل الأمر apt-get install mosquitto على الأنظمة المستندة إلى Debian. إذا كنت ترغب في الحصول على أحدث المستودعات، تأكد من تشغيل sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa مسبقاً.

إليك ما يبدو عليه الإخراج الكامل على FreeBSD:

$ pkg install mosquitto
The package management tool is not yet installed on your system. Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg from pkg+http://pkg.FreeBSD.org/FreeBSD:12:amd64/quarterly, please wait ...
Verifying signature with trusted certificate pkg.freebsd.org.2013102301... done
[mosquitto] Installing pkg-1.14.6...
[mosquitto] Extracting pkg-1.14.6: 100%
Updating FreeBSD repository catalogue...
[mosquitto] Fetching meta.conf: 100% 163 B 0.2kB/s 00:01
[mosquitto] Fetching packagesite.txz: 100% 6 MiB 6.6MB/s 00:01
Processing entries: 100%
FreeBSD repository update completed. 31943 packages processed.
All repositories are up to date.
Updating database digests format: 100%
The following 4 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
	c-ares: 1.16.1
	ca_root_nss: 3.55
	e2fsprogs-libuuid: 1.45.6
	mosquitto: 1.6.7

Number of packages to be installed: 4

The process will require 2 MiB more space.
682 KiB to be downloaded.

Proceed with this action? [y/N]: y
[mosquitto] [1/4] Fetching mosquitto-1.6.7.txz: 100% 226 KiB 231.1kB/s 00:01
[mosquitto] [2/4] Fetching ca_root_nss-3.55.txz: 100% 285 KiB 291.5kB/s 00:01
[mosquitto] [3/4] Fetching e2fsprogs-libuuid-1.45.6.txz: 100% 34 KiB 34.7kB/s 00:01
[mosquitto] [4/4] Fetching c-ares-1.16.1.txz: 100% 138 KiB 140.9kB/s 00:01
Checking integrity... done (0 conflicting)
[mosquitto] [1/4] Installing ca_root_nss-3.55...
[mosquitto] [1/4] Extracting ca_root_nss-3.55: 100%
[mosquitto] [2/4] Installing e2fsprogs-libuuid-1.45.6...
[mosquitto] [2/4] Extracting e2fsprogs-libuuid-1.45.6: 100%
[mosquitto] [3/4] Installing c-ares-1.16.1...
[mosquitto] [3/4] Extracting c-ares-1.16.1: 100%
[mosquitto] [4/4] Installing mosquitto-1.6.7...
===> Creating users
Using existing user 'nobody'.
[mosquitto] [4/4] Extracting mosquitto-1.6.7: 100%
===== Message from ca_root_nss-3.55:

-- FreeBSD does not, and can not warrant that the certification authorities whose
certificates are included in this package have in any way been audited for
trustworthiness or RFC 3647 compliance. Assessment and verification of trust is
the complete responsibility of the system administrator.

This package installs symlinks to support root certificates discovery by default
for software that uses OpenSSL. This enables SSL Certificate Verification by
client software without manual intervention. If you prefer to do this manually,
replace the following symlinks with either an empty file or your site-local
certificate bundle.

	* /etc/ssl/cert.pem
	* /usr/local/etc/ssl/cert.pem
	* /usr/local/openssl/cert.pem

===== Message from mosquitto-1.6.7:

-- The mosquitto MQTT Python driver is now provided by net/py-paho-mqtt

جميع ملفات تهيئة الحزم المثبتة موجودة في المسار /usr/local/etc/mosquitto/. سنحتاج إلى تعديل ملف mosquitto.conf في هذا المجلد لاستخدام الشهادات. إليك كيف يجب أن يبدو:

# Daemon configuration
pid_file /var/run/mosquitto.pid
user nobody

# Port to use for the default listener.
port 8885

# At least one of cafile or capath must be defined.
cafile /root/pki/ca.crt

# Path to the PEM encoded server certificate.
certfile /root/pki/issued/mosquitto.crt

# Path to the PEM encoded keyfile.
keyfile /root/pki/private/mosquitto.key

# Path to CRL file
#crlfile /root/pki/crl.pem

# Each client has their own cert
require_certificate true
use_identity_as_username true

# listener port-number [ip address/host name]
listener 1883
protocol mqtt

# listener port-number [ip address/host name]
# listener 8080
# protocol websockets

# =================================================================
# Logging
# =================================================================
log_dest syslog

# Types of messages to log.
log_type all
#log_type warning
# websockets_log_level 127

# -----------------------------------------------------------------
# Default authentication and topic access control
# -----------------------------------------------------------------
# password_file /usr/local/etc/mosquitto/pwfile

قبل أن نتمكن من بدء تشغيل الخادم، سنحتاج إلى توفير بعض شهادات RSA. سنتناول ذلك في الخطوة التالية.

توفير شهادات الأمان (Certificates Provisioning)

يمكنك استخدام أداة easy-rsa لتوليد شهادات المرجع المصدق (CA)، الخادم (server)، والعميل (client). (هذه التعليمات مستوحاة من هذا الدليل). لأغراض الإنتاج، يجب عليك توليد مفاتيحك وشهاداتك على جهاز غير متصل بالإنترنت. بهذه الطريقة، تكون مفاتيحك الخاصة آمنة إذا أصبح خادمك هدفاً للاختراق.

تثبيت easy-rsa

أولاً، قم بتثبيت easy-rsa:

$ pkg install easy-rsa
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 1 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
	easy-rsa: 3.0.7

Number of packages to be installed: 1

44 KiB to be downloaded.

Proceed with this action? [y/N]: y
[mosquitto] [1/1] Fetching easy-rsa-3.0.7.txz: 100% 44 KiB 44.8kB/s 00:01
Checking integrity... done (0 conflicting)
[mosquitto] [1/1] Installing easy-rsa-3.0.7...
[mosquitto] [1/1] Extracting easy-rsa-3.0.7: 100%

إنشاء شهادات المرجع المصدق (CA) والخادم (Server)

الآن، لنبدأ عملية إنشاء الشهادات:

$ easyrsa init-pki
Note: using Easy-RSA configuration from: /usr/local/share/easy-rsa/vars
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /root/pki

$ easyrsa build-ca
Note: using Easy-RSA configuration from: /usr/local/share/easy-rsa/vars
Using SSL: openssl OpenSSL 1.1.1d-freebsd 10 Sep 2019
Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
Generating RSA private key, 2048 bit long modulus (2 primes)
......................+++++
..................................................................................+++++
e is 65537 (0x010001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:testserver.jaredwolff.com
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at: /root/pki/ca.crt

ملاحظة: سيُطلب منك إدخال كلمة مرور في خطوة build-ca. تأكد من الاحتفاظ بهذه الكلمة في مكان آمن.

ثم لتوليد شهادة الخادم (server cert)، استخدم:

$ easyrsa gen-req mosquitto nopass
Note: using Easy-RSA configuration from: /usr/local/share/easy-rsa/vars
Using SSL: openssl OpenSSL 1.1.1d-freebsd 10 Sep 2019
Generating a RSA private key
...............+++++
........................................+++++
writing new private key to '/root/pki/easy-rsa-82720.X2NVQ0/tmp.akOxhO'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [mosquitto]:testserver.jaredwolff.com
Keypair and certificate request completed.
Your files are:
req: /root/pki/reqs/mosquitto.req
key: /root/pki/private/mosquitto.key

$ easyrsa sign-req server mosquitto
Note: using Easy-RSA configuration from: /usr/local/share/easy-rsa/vars
Using SSL: openssl OpenSSL 1.1.1d-freebsd 10 Sep 2019
You are about to sign the following certificate. Please check over the details shown below for accuracy.
Note that this request has not been cryptographically verified. Please be sure it came from a trusted source or that you have verified the request checksum with the sender.

Request subject, to be signed as a server certificate for 825 days:
subject=
commonName = testserver.jaredwolff.com

Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
Using configuration from /root/pki/easy-rsa-82744.hyuGzt/tmp.lZHLEH
Enter pass phrase for /root/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'testserver.jaredwolff.com'
Certificate is to be certified until Nov 3 01:12:53 2022 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /root/pki/issued/mosquitto.crt

سيُطلب منك إدخال الاسم الشائع (Common Name) (أي اسم خادمك) وكلمة مرور شهادة المرجع المصدق (CA cert password) في الخطوة أعلاه. هام: يجب أن يتطابق الاسم الشائع (Common Name) مع اسم النطاق (domain name) الخاص بخادمك! (تذكر، لقد قمنا بتدوينه سابقاً؟).

إنشاء شهادة العميل للوحة nRF9160 Feather

لتوليد شهادة لوحة nRF9160، استخدم:

$ easyrsa gen-req nrf9160 nopass batch
$ easyrsa sign-req client nrf9160 batch

اتبع نفس الإجراء السابق. الفرق الوحيد هو أننا نولد شهادة عميل (client cert) بدلاً من شهادة خادم (server cert).

بمجرد الانتهاء، سنحتاج إلى بعض الملفات. إليك قائمة كاملة:

  • لخادم Mosquitto الخاص بك:
    • /root/pki/ca.crt
    • /root/pki/private/mosquitto.key
    • /root/pki/issued/mosquitto.crt
  • للوحة nRF9160 Feather الخاصة بك:
    • /root/pki/ca.crt
    • /root/pki/private/nrf9160.key
    • /root/pki/issued/nrf9160.crt

إذا كنت تستخدم التكوين الموضح أعلاه، فإنه يشير بالفعل إلى شهادات الخادم الخاصة بك. كل ما علينا فعله الآن هو بدء تشغيل Mosquitto!

بدء تشغيل خادم Mosquitto

$ service mosquitto start
Cannot 'start' mosquitto. Set mosquitto_enable to YES in /etc/rc.conf or use 'onestart' instead of 'start'.

إذا تلقيت خطأ بشأن mosquitto_enable، قم ببساطة بتشغيل:

$ sysrc mosquitto_enable=YES
$ service mosquitto start
Starting mosquitto.

هذا سيمكن Mosquitto من البدء عند تشغيل نظامك. الآن، تحقق مما إذا كان Mosquitto يعمل باستخدام ps aux:

$ ps aux
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
root 82401 0.0 0.2 11472 2424 - SsJ 01:02 0:00.00 /usr/sbin/syslogd -ss
root 82457 0.0 0.2 11408 2284 - IsJ 01:02 0:00.00 /usr/sbin/cron -J 60 -s
nobody 82900 0.0 0.6 16352 6212 - SsJ 01:17 0:00.02 /usr/local/sbin/mosquitto -c /usr/local/etc/mosquitto/mosquitto.conf -d
root 82488 0.0 0.3 12096 2848 0 IJ 01:02 0:00.01 login [pam] (login)
root 82489 0.0 0.3 13092 3504 0 SJ 01:02 0:00.03 -csh (csh)
root 82902 0.0 0.3 11704 2540 0 R+J 01:17 0:00.00 ps aux

الآن بعد أن أصبح لدينا خادم يعمل، فلننتقل إلى إعداد البرامج الثابتة (firmware) للوحة nRF9160 Feather.

إعداد البرامج الثابتة للوحة nRF9160 Feather

التعامل مع الشهادات على لوحة nRF9160 Feather يتطلب عمليتين رئيسيتين. الخطوة الأولى هي تحميل الشهادات باستخدام البرامج الثابتة at_client. الخطوة الثانية هي تحميل مكتبة mqtt_simple مع دعم TLS المضاف. لنبدأ بالشهادات أولاً.

برمجة at_client أولاً

غيّر الدلائل إلى ncs/nrf/samples/nrf9160/at_client/ وابدأ بناءً جديداً:

$ west build -b circuitdojo_feather_nrf9160ns -p

ثم قم ببرمجة اللوحة باستخدام:

$ west flash --erase
$ nrfjprog -r

سنحتاج إلى هذا المثال على لوحتك للخطوة التالية.

إضافة الشهادات إلى الجهاز

لتثبيت شهاداتنا الجديدة، سنحتاج إلى تثبيت nRF Connect Desktop. يمكنك تنزيله من هنا. ستحتاج أيضاً إلى إصدار مخصص من LTE Link Monitor. يمكنك الحصول على الإصدار المعدل من docs.jaredwolff.com.

  1. أولاً، قم بتثبيت تطبيق nRF Connect Desktop.
  2. ثم، انسخ ملف .tgz الخاص بـ LTE Link Monitor إلى %USERPROFILE%\.nrfconnect-apps\local (على Windows) أو $HOME/.nrfconnect-apps/local (على Linux/macOS). إليك مثال على مكانه في Windows:

مسار تثبيت LTE Link Monitor على Windows

  1. أغلق وأعد فتح nRF Connect Desktop (إذا كان مفتوحاً). ثم، انقر على Open بجانب الإصدار v1.1.1 من LTE Link Monitor. سيظهر أيضاً local تحته.

فتح LTE Link Monitor في nRF Connect Desktop

  1. بعد ذلك، لنطلقه!

إطلاق LTE Link Monitor

  1. بمجرد فتح المنفذ (port)، اضغط على زر إعادة الضبط (reset button). تأكد من إيقاف تشغيل “الطلبات التلقائية” (Automatic requests).

إيقاف تشغيل الطلبات التلقائية في LTE Link Monitor

  1. ثم في مربع الأوامر، أرسل AT+CFUN=4. هذا سيوقف تشغيل المودم (modem) ليكون جاهزاً لتحميل الشهادات. يمكنك تشغيل AT+CFUN? لتأكيد أن المودم في هذا الوضع.

إرسال أمر AT+CFUN=4 لإيقاف تشغيل المودم

  1. افتح مدير الشهادات (Certificate manager).

فتح مدير الشهادات في LTE Link Monitor

  1. تأكد من تعيين علامة الأمان (security tag). في هذه الحالة، أستخدم 1234. هذا معرف مهم ستحتاجه لاحقاً. اجعله ما تريد ولكن تجنب استخدام 16842753. هذه هي العلامة الافتراضية لـ NRF Cloud، ولا تريد مسح شهادات nRF Cloud الخاصة بك!

تعيين علامة الأمان للشهادات

  1. انسخ والصق محتويات ملفات ca.crt، nrf9160.crt، و nrf9160.key في المربعات (بهذا الترتيب). يمكنك بسهولة الحصول على الشهادات باستخدام الأمر cat على أنظمة Unix/Linux:
$ cat ca.crt
-----BEGIN CERTIFICATE-----
MIIDdTCCAl2gAwIBAgIUDLkBxLLQO9wosNDtA7E9qvqHOxMwDQYJKoZIhvcNAQEL
BQAwJDEiMCAGA1UEAwwZdGVzdHNlcnZlci5qYXJlZHdvbGZmLmNvbTAeFw0yMDA3
MzEwMTExNDJaFw0zMDA3MjkwMTExNDJaMCQxIjAgBgNVBAMMGXRlc3RzZXJ2ZXIu
amFyZWR3b2xmZi5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3
de1v8k+FXzY/Im7Z2YKS7wwbBRft5CUxqP1sdYJgMvheS9LhFufk81URZ0lHD9pK
aNPxU1UEmnLvVDTGLJ+YAmMH08xn17FS1R1UVPYzi2ouwqRM2pR9EStsSlP9Zj44
1MsdizABnnlkZndUVLL/gjc4cNsNncMLBSEbsz6b5WzhtAGg3rOpdAxSSblZVSFw
bquCgg5hb2NUzy+JxGtUIsE5d6CxTDdSs4Z3FK/RRYjmCG6qsaya4N5W35yf8h5O
StfKRecl3kq2kCnWa6P+lErG4wuxIBtMkgz2zV+zd1tz4aHXxSdoZTqLz7dTVbFA
zEVnKD+ZReBG+4fwUL6rAgMBAAGjgZ4wgZswHQYDVR0OBBYEFIvdGnjrxRPzvXQi
7XJ70LzpZSOjMF8GA1UdIwRYMFaAFIvdGnjrxRPzvXQi7XJ70LzpZSOjoSikJjAk
MSIwIAYDVQQDDBl0ZXN0c2VydmVyLmphcmVkd29sZmYuY29tghQMuQHEstA73Ciw
0O0DsT2q+oc7EzAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIBBjANBgkqhkiG9w0B
AQsFAAOCAQEAIzz1nSSDkPueNPlADRYMDOMFNkxoKA+gRXwDVa7y39As7IZp7Fqr
KAH79U1XtGyDlt6FPKTvDJ7jtd4y8auIGVQO7z3AG9pVU1imIWZHoIqgBUCEhsjp
uMxD23kRCX5kd9dsmF9WOGGxb4kkMv83Rh2rCONQmvnozuI3fJv2ZFX/ORoADGLP
OPSJPl11x+2rxPxiLi+T8RyzDh3DwqnPVsSnbRWV7hosaN0ip/cbnSTaIul9mbCY
ID6qm9leqlY/gha9aZfg+tv1Lm6PT6o8Pzek2VeDoIS5YERBMOwV84hQrZjV3vIE
jT6y663HGsl7KvqVaWdV3fM6Cr7f0QdR5A==
-----END CERTIFICATE-----

ستحتاج إلى كل شيء من -----BEGIN CERTIFICATE----- إلى -----END CERTIFICATE-----.

لصق محتوى الشهادات في مدير الشهادات

  1. تحقق من منطقة السجل (Log area) لمزيد من التفاصيل. إذا سارت الأمور على ما يرام، يجب أن تشير إلى تحديث شهاداتك.

تأكيد تحديث الشهادات في سجل LTE Link Monitor

استخدام مثال mqtt_simple مع دعم TLS

سنستخدم مثال mqtt_simple الموجود في مستودع nRF Connect SDK. المسار الكامل هو: ncs/nrf/samples/nrf9160/mqtt_simple. سنحتاج إلى إجراء بعض التعديلات لإضافة توافق كامل مع TLS. جميع الملفات موجودة داخل دليل mqtt_simple.

أولاً، سنضطر إلى تحديث ملف proj.conf. لاحظ الاختلافات المميزة:

تعديلات ملف proj.conf لدعم TLS

قسم # Set the PDP Context مهم بشكل خاص إذا كنت تستخدم بطاقة Hologram SIM (المضمنة مع لوحة nRF9160 Feather). إذا كنت تستخدم بطاقة SIM لا تحتاج إليها، فلن تحتاج إلى هذا القسم. قم بتكييف CONFIG_MQTT_BROKER_HOSTNAME الخاص بك ليتناسب مع اسم مضيفك (الذي تم تكوينه في بداية هذا الدليل).

سيتعين عليك أيضاً إضافة هذه الأسطر في KConfig:

config SEC_TAG int "Security tag to use for the connection" default 1234
config PEER_VERIFY int "Peer verify parameter for mqtt_client" default 1 help Set to 0 for VERIFY_NONE, 1 for VERIFY_OPTIONAL, and 2 for VERIFY_REQUIRED.

أخيراً، في ملف main.c، أضف هذه الكتلة إلى أعلى الملف:

#if defined(CONFIG_MQTT_LIB_TLS)
static sec_tag_t sec_tag_list[] = { CONFIG_SEC_TAG };
#endif /* defined(CONFIG_MQTT_LIB_TLS) */

ثم أضف هذه الكتلة إلى دالة client_init تحت #if defined(CONFIG_MQTT_LIB_TLS):

struct mqtt_sec_config *tls_config = &client->transport.tls.config;
client->transport.type = MQTT_TRANSPORT_SECURE;
tls_config->peer_verify = CONFIG_PEER_VERIFY;
tls_config->cipher_count = 0;
tls_config->cipher_list = NULL;
tls_config->sec_tag_count = ARRAY_SIZE(sec_tag_list);
tls_config->sec_tag_list = sec_tag_list;
tls_config->hostname = CONFIG_MQTT_BROKER_HOSTNAME;

يجب أن تبدو التغييرات كما يلي:

تعديلات الكود في ملف main.c لدعم TLS

ثم قم بالبناء باستخدام:

$ west build -b circuitdojo_feather_nrf9160ns -p

أخيراً، قم ببرمجته باستخدام west flash:

$ west flash --erase
$ nrfjprog -r

افتح الطرفية التسلسلية (serial terminal) وتحقق مرة أخرى من أن لوحة nRF9160 Feather تتصل. يمكنك أيضاً استخدام LTE Link Monitor لعرض تقدمك (مثال أدناه).

مراقبة اتصال nRF9160 Feather عبر LTE Link Monitor

الكثير من المعلومات المذكورة أعلاه جاءت من مقال Nordic حول هذا الموضوع.

إرسال رسالة اختبار

لقد وصلنا تقريباً إلى النهاية! لقد قمت بتكوين لوحة nRF9160 Feather للاتصال بخادم Mosquitto باستخدام شهادات تم إنشاؤها ذاتياً. الجزء الأخير هو ربط جهاز آخر لمعرفة ما إذا كانت لوحة nRF9160 Feather تستجيب لرسالة.

لقد أنشأت مجموعة جديدة من الشهادات لهذا الغرض. أطلقت عليها اسم test.

$ easyrsa gen-req test nopass batch
$ easyrsa sign-req client test batch

نسختها إلى سطح مكتبي باستخدام CyberDuck (عميل SFTP مرئي رائع):

نقل الشهادات باستخدام CyberDuck

يمكنك أيضاً استخدام شيء مثل scp إذا كنت واثقاً من قدراتك في نقل الملفات عبر سطر الأوامر.

ثم، افتح طرفية وقم بتشغيل:

mosquitto_sub --cafile ca.crt --cert test.crt --key test.key -q 1 -d -h testserver.jaredwolff.com -p 8885 -t "/my/publish/topic" &
mosquitto_pub --cafile ca.crt --cert test.crt --key test.key -q 1 -d -h testserver.jaredwolff.com -p 8885 -t "/my/subscribe/topic" -m "hello there"

يجب أن ترى إخراجاً مشابهاً لهذا:

$ mosquitto_sub --cafile ca.crt --cert test.crt --key test.key -q 1 -d -h testserver.jaredwolff.com -p 8885 -t "/my/publish/topic" &
$ mosquitto_pub --cafile ca.crt --cert test.crt --key test.key -q 1 -d -h testserver.jaredwolff.com -p 8885 -t "/my/subscribe/topic" -m "hello there"
Client mosq-CczskQKzMKdtTo4O4s sending CONNECT
Client mosq-CczskQKzMKdtTo4O4s received CONNACK (0)
Client mosq-CczskQKzMKdtTo4O4s sending PUBLISH (d0, q1, r0, m1, '/my/subscribe/topic', ... (11 bytes))
Client mosq-CczskQKzMKdtTo4O4s received PUBACK (Mid: 1, RC:0)
Client mosq-CczskQKzMKdtTo4O4s sending DISCONNECT
MacBook-Pro:Downloads jaredwolff$ Client mosq-qK8tMlJk0Qri4Z7jUo sending PINGREQ
Client mosq-qK8tMlJk0Qri4Z7jUo received PINGRESP
MacBook-Pro:Downloads jaredwolff$ Client mosq-qK8tMlJk0Qri4Z7jUo received PUBLISH (d0, q0, r0, m0, '/my/publish/topic', ... (11 bytes))
hello there

تهانينا! لديك الآن اتصال عملي نشط بخادم Mosquitto الخاص بك.

الخلاصة

لقد وصلنا إلى نهاية هذا الدليل الشامل! في هذه المرحلة، يجب أن يكون لديك خادم Mosquitto يعمل ولوحة nRF9160 Feather متصلة به بأمان باستخدام شهادات TLS. يمكنك الآن استخدام هذه المهارات الجديدة لإضافة المزيد من الأجهزة إلى تطبيقات إنترنت الأشياء الخاصة بك وتوسيع نطاق مشاريعك.

إذا لم تكن قد جربت لوحة nRF9160 Feather بعد، فنحن نوصي بشدة بالاطلاع عليها. فهي تجمع بين وحدة Nordic Semiconductor nRF9160 LTE-M، NB IoT، و GPS Combo، بالإضافة إلى مصدر طاقة مرن، ذاكرة فلاش خارجية، وقدرة على الإغلاق منخفض الطاقة. وهل ذكرنا أنها مفتوحة المصدر بنسبة 100%؟ تعرف على المزيد من خلال الاطلاع على حملتها على GroupGets و Hackster Launch.

لوحة nRF9160 Featherمكونات لوحة nRF9160 Feather

مصدر الصور يعود إلى فريق GroupGets الرائع!

الخلاصة التقنية

يُبرز هذا الدليل أهمية تأمين اتصالات إنترنت الأشياء باستخدام بروتوكول MQTT وشهادات TLS على لوحة nRF9160 Feather. من خلال استضافة وسيط Mosquitto ذاتياً وتوليد شهادات PKI مخصصة، يمكن للمطورين تحقيق بيئة MQTT آمنة وموثوقة، ضرورية للتطبيقات الحساسة. تُعد عملية إعداد الشهادات على الجهاز وتعديل البرامج الثابتة خطوات حاسمة لضمان المصادقة والتشفير، مما يوفر أساساً قوياً لنشر أجهزة nRF9160 في بيئات إنتاجية تتطلب مستوى عالٍ من الأمان.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *