MQTT از طریق SSL
ThingsBoard امکان اجرای سرور MQTT بر روی SSL را فراهم میکند. هر دو نوع یکطرفه و دوطرفه SSL پشتیبانی میشوند.
بیشتر محیطهای ThingsBoard از Load Balancer به عنوان نقطه پایانی برای اتصال SSL بین دستگاهها و سرویسهای پلتفرم استفاده میکنند. به عبارت دیگر، ترافیک MQTT بین دستگاه و متعادل کننده بار رمزگذاری میشود، اما بین Load Balancer و سرویسهای پلتفرم رمزگشایی میشود. مزیت این روش سادگی پیکربندی است. بیشتر Load Balancer های ابری (مانند AWS، Google Cloud و غیره) ابزارهای تولید گواهینامه و مستندات کاملی برای پیکربندی SSL بر روی TCP دارند. معایب این روش این است که امکان SSL دوطرفه وجود ندارد. اطلاعات مربوط به گواهینامه مشتری از Load Balancer به سرویسهای پلتفرم منتقل نمیشود.
با این حال، میتوان ThingsBoard را به صورت SSL دوطرفه برای MQTT پیکربندی کرده و از قطع اتصال SSL در Load Balancer خودداری کرد. ما توصیه میکنیم از گواهینامههای SSL معتبر تولید شده با استفاده از مراجع CA معتبر استفاده کنید و از صرف وقت برای حل مشکلات گواهینامههای ایجاد شده توسط خودداری کنید. دستورالعملهای زیر را برای پیکربندی SSL برای گواهینامههای ذخیره شده در فرمت PEM یا Java Keystore مشاهده کنید.
پیکربندی SSL با استفاده از فایلهای گواهی PEM
از نسخه TB 3.3.2 موجود است
پیکربندی متغیرهای محیطی زیر را از طریق فایل پیکربندی، فایل Docker Compose یا اسکریپتهای Kubernetes انجام دهید. به عنوان مثال، از فایل thingsboard.conf استفاده میکنیم:
... export MQTT_SSL_ENABLED=true export MQTT_SSL_CREDENTIALS_TYPE=PEM export MQTT_SSL_PEM_CERT=server.pem export MQTT_SSL_PEM_KEY=server_key.pem export MQTT_SSL_PEM_KEY_PASSWORD=secret ...
جایی که:
- MQTT_SSL_ENABLED – فعال/غیرفعال کردن پشتیبانی SSL.
- MQTT_SSL_CREDENTIALS_TYPE – نوع اعتبار سرور. PEM – فایل گواهی pem. KEYSTORE – فروشگاه کلید جاوا؛
- MQTT_SSL_PEM_CERT – مسیر فایل گواهی سرور. گواهی سرور یا زنجیره گواهی را نگه می دارد، همچنین ممکن است شامل کلید خصوصی سرور باشد.
- MQTT_SSL_PEM_KEY – مسیر فایل کلید خصوصی گواهی سرور. به صورت پیش فرض اختیاری است. اگر کلید خصوصی در فایل گواهی سرور وجود نداشته باشد، الزامی است.
- MQTT_SSL_PEM_KEY_PASSWORD – رمز عبور کلید خصوصی گواهی سرور اختیاری.
پس از تکمیل تنظیمات، سرور Thingsconnect را راه اندازی یا راه اندازی مجدد کنید.
تنظیمات تکمیلی پیکربندی
میتوانید تنظیمات زیر را از طریق فایل پیکربندی، docker-compose یا اسکریپتهای kubernetes پیکربندی کنید.
MQTT_SSL_BIND_ADDRESS – آدرس بایند برای سرور MQTT. مقدار پیشفرض 0.0.0.0 به معنی همهٔ رابطها است.
MQTT_SSL_BIND_PORT – پورت بایند برای سرور MQTT. مقدار پیشفرض 8883 است.
MQTT_SSL_PROTOCOL – نام پروتکل SSL. مقدار پیشفرض TLSv1.2 است. برای اطلاعات بیشتر مستندات جاوا را مشاهده کنید.
MQTT_SSL_SKIP_VALIDITY_CHECK_FOR_CLIENT_CERT – عدم بررسی اعتبار گواهی برای گواهینامههای مشتری. مقدار پیشفرض false است.
تولید گواهینامههای ایجاد شده توسط خود
از دستورات زیر برای تولید فایلهای گواهینامه خود استفاده کنید. این فرآیند برای تستها مفید است، اما زمانبر و برای استفاده در محیط تولید توصیه نمیشود.
فایل گواهی PEM
توجه: این مرحله نیازمند سیستمعامل بر پایهٔ لینوکس با نصب openssl است.
برای تولید گواهینامه PEM خود به صورت سلف-ساین شده و کلید خصوصی، از دستور زیر استفاده کنید:
openssl ecparam -out server_key.pem -name secp256r1 -genkey openssl req -new -key server_key.pem -x509 -nodes -days 365 -out server.pem
همچنین میتوانید -nodes (مخفف no DES) را اضافه کنید، اگر نمیخواهید کلید خصوصی خود را با گذرواژه محافظت کنید. در غیر اینصورت، شما را برای وارد کردن گذرواژهای با “حداقل 4 کاراکتر” دعوت میکند.
پارامتر روزها (365) را میتوانید با هر عدد دلخواه جایگزین کنید تا تاریخ انقضا را تغییر دهید. سپس شما را برای مواردی مانند “نام کشور” سوال میکند، اما شما میتوانید فقط Enter را فشار دهید و پیشفرضها را قبول کنید.
اضافه کردن -subj ‘/CN=localhost’ برای سرکوب سؤالات در مورد محتوای گواهی (localhost را با دامنهٔ موردنظر خود جایگزین کنید).
گواهینامههای سلف-ساین شده توسط هیچ سازمان مورد تأییدی نمیباشند مگر اینکه آنها را پیشتر به مرورگرها وارد کنید. اگر به امنیت بیشتری نیاز دارید، باید از گواهینامهای استفاده کنید که توسط یک مرجع اعتبارسنجی گواهی (CA) امضا شده است.
نمونههای مشتری
منابع زیر را مشاهده کنید:
- گزینههای تأیید هویت دستگاه برای مرورگر گزینههای تأیید هویت را بررسی کنید.
- احراز هویت بر اساس توکن دسترسی برای مثالی از اتصال SSL یکطرفه.
- احراز هویت بر اساس گواهی X.509 برای مثالی از اتصال SSL دوطرفه.