احراز هویت بر اساس گواهی نامه X.509
گواهینامههای X.509 برای برقراری احراز هویت متقابل (دوطرفه) برای MQTT بر روی TLS استفاده میشوند. این مکانیزم مشابه احراز هویت با استفاده از توکن (Token) است، اما از گواهینامه X.509 به جای توکن استفاده میکند.
دستورالعملهای زیر توضیح خواهند داد که چگونه با استفاده از گواهینامه X.509، به ThingsBoard Cloud متصل شوید.
در اینجا، دو راهبرد برای برقراری ارتباط بین مشتری و ThingsBoard مورد استفاده قرار میگیرند:
1. زنجیره گواهی X.509 – توصیه شده
ThingsBoard را تنظیم کنید تا به تمام گواهینامههای مشتری از یک معتبرکننده اعتماد کند (گواهی میانی). نام دستگاه به طور خودکار از نام مشترک گواهی با استفاده از عبارت منظم قابل پیکربندی استخراج میشود. این ویژگی نیاز به بهروزرسانی دستی گواهی در هر دستگاه را در هنگام تغییر گواهی از بین میبرد. علاوه بر این، اگر ایجاد دستگاههای جدید در تنظیمات فعال باشد، امکان خودکارپیکربندی دستگاههای جدید را از طریق MQTT فراهم میکند.
2. گواهینامه X.509.
ThingsBoard را پیکربندی کنید تا به اتصال از دستگاههای خاص با استفاده از گواهینامههای پیشپیکربندی شده اعتماد کند.
- زنجیره گواهی X.509 (توصیه شده)
- گواهی X.509
زنحیره گواهی X.509
مرحله 1. آمادهسازی سرور و زنجیره گواهی
تیم ThingsBoard در حالت Cloud، یک گواهی معتبر برای ThingsBoard را فراهم کرده است. اگر شما نمونه ThingsBoard خود را میزبانی میکنید، دستورالعمل MQTT بر روی SSL را دنبال کنید تا گواهی سرور را فراهم کنید.
با فراهم کردن گواهی، باید یک زنجیره گواهی به فرمت pem آماده کنید. این زنجیره توسط مشتری MQTT برای اعتبارسنجی گواهی سرور استفاده میشود. زنجیره را در دایرکتوری کاری خود به نام “tb-server-chain.pem” ذخیره کنید. یک نمونه از زنجیره گواهی برای mqtt.thingsboard.cloud در اینجا قرار دارد.
مرحله 2. تولید زنجیره گواهی مشتری
باید یک زنجیره گواهی با نامهای مشترک (CNs) مناسب تولید کنیم. ما از گواهی میانی برای امضای گواهیهای دستگاههای خود استفاده خواهیم کرد. به عنوان مثال، نامهای مشترک زنجیره گواهی ممکن است به شرح زیر باشد:
نامهای مشترک گواهی ریشه (Root certificate): company-name.com گواهی میانی (Intermediate certificate): device-group-name.company-name.com گواهی دستگاه (Device certificate): device-name.device-group-name.company-name.com
برای تولید کلیدهای خصوصی با خودامضا (self-signed)، درخواست امضای گواهی (CSR) و گواهی x509 برای هر سطح زنجیره، از دستورات زیر استفاده کنید. این دستورات بر اساس ابزار OpenSSL است که احتمالاً در کامپیوتر کاری شما نصب شده است:
مرحله 2.1 تولید گواهی ریشه
برای تولید گواهی ریشه و کلید خصوصی، از دستور زیر استفاده کنید. در هنگام پرسیده شدن، لطفاً CN صحیح را وارد کنید:
openssl req -x509 -newkey rsa:4096 -keyout rootKey.pem -out rootCert.pem -sha256 -days 365 -nodes
نمونه خروجی، با ارجاع به “company.com” به عنوان CN:
Generating a RSA private key writing new private key to 'rootKey.pem' ----- 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. ----- Country Name (2 letter code) [AU]: State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:company.com Email Address []:
مرحله 2.2 تولید گواهی نامه میانی
برای تولید کلید و درخواست گواهی نامه میانی، از دستور زیر استفاده کنید. فراموش نکنید که CN درخواستی را با دقت وارد کنید:
openssl req -new -newkey rsa:4096 -keyout intermediateKey.pem -out intermediate.csr -sha256 -nodes
خروجی نمونه، با ارجاع به “group.company.com” به عنوان CN:
Generating a RSA private key writing new private key to 'intermediateKey.pem' ----- 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. ----- Country Name (2 letter code) [AU]: State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:group.company.com Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
برای تولید گواهی میانی، از دستور زیر استفاده کنید. فراموش نکنید که CN در هنگام درخواست وارد کنید:
openssl x509 -req -in intermediate.csr -out intermediateCert.pem -CA rootCert.pem -CAkey rootKey.pem -days 365 -sha256 -CAcreateserial
خروجی نمونه:
Signature ok subject=C = AU, ST = Some-State, O = Internet Widgits Pty Ltd, CN = group.company.com Getting CA Private Key
مرحله 2.3 تولید گواهی دستگاه
برای تولید گواهی دستگاه، از دستور زیر استفاده کنید. فراموش نکنید که CN در هنگام درخواست وارد کنید:
openssl req -new -newkey rsa:4096 -keyout deviceKey.pem -out device.csr -sha256 -nodes
نمونهای از خروجی، با اشاره به CN به عنوان device123.group.company.com:
Generating a RSA private key writing new private key to 'deviceKey.pem' ----- 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. ----- Country Name (2 letter code) [AU]: State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]:device.group.company.com Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []: Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
برای تولید گواهی میانی، از دستور زیر استفاده کنید. فراموش نکنید که CN صحیح را وقتی پرسیده شد، وارد کنید.
openssl x509 -req -in device.csr -out deviceCert.pem -CA intermediateCert.pem -CAkey intermediateKey.pem -days 365 -sha256 -CAcreateserial
نمونه خروجی:
Signature ok subject=C = AU, ST = Some-State, O = Internet Widgits Pty Ltd, CN = device.group.company.com Getting CA Private Key
در نهایت، شما باید گواهینامهها را به صورت پشت سر هم قرار دهید، شروع کرده از گواهینامه دستگاه تا ریشه.
cat deviceCert.pem intermediateCert.pem rootCert.pem > chain.pem
خروجی دستورات شامل کلیدهای خصوصی و گواهینامهها برای هر سطح از زنجیره خواهد بود. در مراحل بعدی، از فایل کلید دستگاه به نام deviceKey.pem و زنجیرهای از گواهینامهها به نام chain.pem استفاده خواهیم کرد.
مرحله ۳. فراهم کردن کلید عمومی میانی مشتری به عنوان استراتژی ارائه پروفایل دستگاه X509
به رابط کاربری وب ThingsBoard بروید -> پروفایلها -> پروفایلهای دستگاه -> پروفایل دستگاه شما -> تأمین دستگاه. استراتژی تأمین گواهینامههای زنجیره X.509 را انتخاب کنید، محتویات فایل intermediateCert.pem را درج کنید و الگوی عبارت منظم برای بازیابی نام مشترک از deviceCert.pem را انتخاب کنید، انتخاب کنید که آیا اجازه ایجاد دستگاههای جدید دارید یا خیر و بر روی ذخیره کلیک کنید. به علاوه، این کار را میتوانید از طریق رابط برنامه نویسی در بسته REST انجام دهید.
مرحله ۴. آزمایش اتصال
برای بارگذاری خواندنهای دما به ThingsBoard Cloud با استفاده از کانال امن، دستور زیر را اجرا کنید:
mosquitto_pub --cafile tb-server-chain.pem -d -q 1 -h "YOUR_TB_HOST" -p "8883" \ -t "v1/devices/me/telemetry" --key deviceKey.pem --cert chain.pem -m {"temperature":25}
دستور مشابه برای گواهینامه سرور خودامضا شده:
mosquitto_pub --insecure --cafile server.pem -d -q 1 -h "YOUR_TB_HOST" -p "8883" \ -t "v1/devices/me/telemetry" --key deviceKey.pem --cert chain.pem -m {"temperature":25}
فراموش نکنید که YOUR_TB_HOST را با میزبان نمونه ThingsBoard خود جایگزین کنید.
گواهی نامه X.509
مرحله ۱. آماده سازی سرور و زنجیره گواهی
تیم ThingsBoard یک گواهی معتبر برای ThingsBoard Cloud فراهم کرده است. اگر نمونه ThingsBoard خود را میزبانی کنید، دستورالعمل MQTT بر روی SSL را دنبال کنید تا گواهی سرور را فراهم کنید. پس از فراهم شدن، باید یک زنجیره گواهی را به صورت pem آماده کنید. این زنجیره توسط مشتری MQTT برای اعتبارسنجی گواهی سرور استفاده می شود. زنجیره را در دایرکتوری کاری خود به عنوان “tb-server-chain.pem” ذخیره کنید. یک نمونه از زنجیره گواهی برای mqtt.thingsboard.cloud در اینجا قرار دارد.
مرحله ۲. تولید گواهی مشتری
از دستور زیر برای تولید کلید خصوصی و گواهی x509 خودامضا استفاده کنید. این دستور بر اساس ابزار openssl است که احتمالاً در ایستگاه کاری شما نصب شده است: برای تولید کلید و گواهی مبتنی بر RSA از دستور زیر استفاده کنید:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 365 -nodes
برای تولید کلید و گواهی مبتنی بر EC، از دستور زیر استفاده کنید:
openssl ecparam -out key.pem -name secp256r1 -genkey openssl req -new -key key.pem -x509 -nodes -days 365 -out cert.pem
خروجی دستور شامل یک فایل کلید خصوصی به نام key.pem و یک گواهی عمومی به نام cert.pem خواهد بود. در مراحل بعد از آنها استفاده میکنیم
مرحله ۳. فراهم کردن کلید عمومی مشتری به عنوان اطلاعات اعتبار سنجی دستگاه
به محیط کاربری وب ThingsBoard بروید -> موجودیتها -> دستگاهها -> دستگاه شما -> مدیریت اعتبارها. گواهی X.509 را برای اعتبارهای دستگاه انتخاب کنید، محتویات فایل cert.pem را درج کنید و روی ذخیره کلیک کنید. به طور جایگزینی، همین کار را میتوانید از طریق رابط برنامه نویسی REST انجام دهید.
مرحله ۴. تست اتصال
برای بارگذاری خواندنیهای دما به ThingsBoard Cloud از طریق کانال امن، دستور زیر را اجرا کنید:
mosquitto_pub --cafile tb-server-chain.pem -d -q 1 -h "YOUR_TB_HOST" -p "8883" \ -t "v1/devices/me/telemetry" --key key.pem --cert cert.pem -m {"temperature":25}
فراموش نکنید که YOUR_TB_HOST را با میزبان نمونه ThingsBoard خود جایگزین کنید.