کاربرد SSL بسیار گسترده است؛ از محافظت از اطلاعات حساس کاربران در وبسایتهای بانکی و فروشگاهی گرفته تا ایمنسازی ارتباط بین تجهیزات اینترنت اشیا (IoT) مانند ماژولهای مخابراتی و سرورهای ابری. در پروژههای IoT، استفاده از SSL نقش حیاتی در جلوگیری از حملات میانی (Man-in-the-Middle) و افشای اطلاعات دارد. این پروتکل به توسعهدهندگان این امکان را میدهد تا با اطمینان بیشتری دادهها را بین دستگاهها و سرورها انتقال دهند و اعتماد کاربران را جلب کنند. در یک جمله، SSL نهتنها ستون امنیت ارتباطات دیجیتال امروزی است، بلکه پایهای حیاتی برای ساخت سیستمهای هوشمند و قابل اعتماد در آینده نیز بهشمار میرود.
پروتکل HTTPS (HyperText Transfer Protocol Secure) نسخهای امن از HTTP است که برای انتقال دادهها بین مرورگر کاربر و سرور وب بهکار میرود. تفاوت اصلی HTTPS با HTTP در استفاده از SSL/TLS برای رمزنگاری ارتباط است. این رمزنگاری باعث میشود اطلاعات ارسالی و دریافتی بین کاربر و سرور توسط اشخاص ثالث قابل مشاهده یا دستکاری نباشد.
رمزنگاری دادهها: جلوگیری از شنود اطلاعات توسط مهاجمان.
احراز هویت سرور: کاربران مطمئن میشوند که با وبسایت واقعی در ارتباط هستند، نه نسخهای جعلی.
یکپارچگی دادهها: جلوگیری از تغییر یا خراب شدن دادهها در مسیر انتقال.
جلب اعتماد کاربران: مرورگرها سایتهای بدون HTTPS را با پیامهای هشدار نمایش میدهند.
بهبود رتبه سایت در گوگل: HTTPS یکی از فاکتورهای رتبهبندی در موتور جستجو است.
گواهینامه SSL نشان میدهد که یک وبسایت از رمزنگاری ایمن استفاده میکند و توسط یک مرجع معتبر (CA – Certificate Authority) تأیید شده است. گواهینامهها از نظر سطح اعتبار و نوع اعتبارسنجی به سه دسته کلی تقسیم میشوند:
سادهترین و ارزانترین نوع گواهی.
فقط مالکیت دامنه تأیید میشود.
مناسب برای وبسایتهای شخصی و وبلاگها.
آدرس با HTTPS شروع میشود و قفل سبز ظاهر میشود.
سریعترین زمان صدور.
علاوه بر دامنه، هویت سازمان مالک دامنه نیز بررسی و تأیید میشود.
اطلاعات شرکت در گواهی قابل مشاهده است.
مناسب برای وبسایتهای تجاری و دولتی.
زمان صدور بیشتر از DV.
بالاترین سطح اعتبار و امنیت.
نیاز به بررسی دقیق حقوقی و مستندات شرکت دارد.
در برخی مرورگرها، نام شرکت در کنار آدرس سایت نمایش داده میشود.
مناسب برای بانکها، فروشگاههای بزرگ و سامانههای مالی.
Single Domain Certificate: برای یک دامنه خاص (مثلاً example.com
)
Wildcard Certificate: برای دامنه و تمام زیردامنهها (*.example.com
)
Multi-Domain Certificate (SAN): پشتیبانی از چند دامنه مختلف در یک گواهی.
در پروژههای اینترنت اشیا (IoT)، از گواهی SSL برای امنسازی ارتباط بین دستگاهها (مثل ماژولهای 4G) و سرور استفاده میشود. این گواهیها میتوانند:
روی سرور نصب شوند تا دستگاهها به آن متصل شوند.
یا در خود دستگاه تعبیه شوند تا ارتباط client-authenticated برقرار شود (مانند استفاده از client.crt
, client.key
).
انواع مختلف گواهی ها در جدول زیر قابل مشاهده است.
زنجیره اعتماد یعنی: «مرورگر یا دستگاه شما چطور میفهمد که گواهینامهای که سرور ارسال کرده، قابل اعتماد است یا نه؟»
اینجا یک ساختار سلسله مراتبی داریم:
انواع مختلف گواهی ها در جدول زیر قابل مشاهده است.
نوع گواهینامه | کاربرد | صادرکننده | در سمت | نکته |
Root Cert | پایه اعتماد | CA | مرورگر / سیستم | از قبل نصب شده |
Intermediate Cert | لینک بین Root و Server | CA | سرور | توسط CA مدیریت میشود |
Server Cert | احراز هویت دامنه | CA | سرور | به کلاینت ارسال میشود |
Client Cert | احراز هویت کاربر | CA / سازمان | کلاینت | نیاز به تنظیم روی سرور دارد |
فرض کن به سایت https://sisoog.com
وصل میشی:
مرورگر یا دستگاه شما درخواست اتصال میفرسته.
سرور sisoog.com
:
گواهینامه خود (Server Certificate)
بهعلاوه گواهینامه واسط (Intermediate Certificate)
رو برای شما میفرسته.
دستگاه یا مرورگر شما گواهیها را بررسی میکنه:
بررسی میکنه که آیا گواهی واسط واقعاً توسط یک Root CA معتبر امضا شده؟
این Root CA باید در سیستمعامل یا فریمور شما از قبل وجود داشته باشه (مثلاً در خود فریمور ماژول).
اگر همه چیز درست باشه، ارتباط امن برقرار میشه. وگرنه، خطای SSL Handshake Failed دریافت میکنی.
گواهی هایی که استفاده میکنیم در جدول زیر قراردارند:
فایل | توضیح |
server.crt | گواهینامه عمومی سرور |
server.key | کلید خصوصی سرور |
intermediate.crt | گواهینامه واسط |
root.crt | گواهینامه ریشه (سیستم معمولاً از قبل داره) |
client.crt | گواهینامه کلاینت (برای mutual TLS) |
client.key | کلید خصوصی کلاینت |
client.csr | درخواست صدور گواهی (Certificate Signing Request) |
مثلاً اگه یه هکر با روش مرد میانی (MITM) بیاد و یه گواهی جعلی با دامنه sisoog.com
برای شما بفرسته:
اگر کل زنجیره اعتماد اون گواهی، به یک Root CA معتبر نرسه،
یا اگر کلید عمومی و امضای دیجیتال اون گواهی با دامنه اصلی نخونه،
مرورگر یا دستگاه خطا میده:
Untrusted Certificate
, SSL Handshake Failed
, Certificate Not Valid
, و…
خب حالا که با انواع گواهی ها و روش امن کردن ارتباط آشنا شدید به سراغ کد میرویم.
برای استفاده از HTTPS لازم است تابع زیر را از مسیر (/components/ql-application/init/ql_init.c) از حالت کامنت خارج کنید.
1 2 3 4 5 6 | #ifdef QL_APP_FEATURE_HTTP // ql_http_app_init(); // ql_http_post_app_init(); // ql_http_put_app_init(); ql_https_get_app_init(); #endif |
باتوجه به اینکه فایلهای (Certificate) را در SDcard قراردادم نیاز بود تا از تابع (ql_sdmmc_app_init();) که در پست قبل باهم بررسی کردیم استفاده کنیم که آن را هم از حالت کامنت خارج کردم و سپس فایلها را به صورت زیر در کد تعریف میکنیم.
1 2 3 | #define ROOT_CRT_PATH "SD:root.crt" #define CLIENT_KEY_PATH "SD:client.key" #define CLIENT_CRT_PATH "SD:client.crt" |
برای ساخت فایلهای مورد نیاز که قرار است در SDcard قراردهیم، در لینوکس از دستورات زیر استفاده کنید.
1 2 3 4 5 6 7 8 | # Generate client private key openssl genpkey -algorithm RSA -out client.key -pkeyopt rsa_keygen_bits:2048 # Create a certificate signing request (CSR) openssl req -new -key client.key -out client.csr # Self-sign or get it signed by a CA (for demo: self-signed) openssl x509 -req -in client.csr -signkey client.key -out client.crt -days 365 |
و در ویندوز پس از نصب برنامه Openssl (و افزودن آن به path ویندوز) از دستورات زیر استفاده کنید.
1 2 3 4 5 6 7 8 | :: Generate a private RSA key openssl genpkey -algorithm RSA -out client.key -pkeyopt rsa_keygen_bits:2048 :: Generate a Certificate Signing Request (CSR) openssl req -new -key client.key -out client.csr :: Self-sign the certificate (valid for 365 days) openssl x509 -req -in client.csr -signkey client.key -out client.crt -days 365 |
سپس میتوانید فایلهای را به SDcard منتقل کنید.
در نهایت این قسمت کد را ویرایش کنید. (آدرسی که استفاده شده برای مثال بوده و شما میتوانید از آدرسهای دیگر استفاده کنید.)
1 2 3 | char *url[3] = { "https://docs.kernel.org/_sources/driver-api/cxl/devices/device-types.rst.txt", "https://docs.kernel.org/_sources/driver-api/cxl/devices/device-types.rst.txt", "https://docs.kernel.org/_sources/driver-api/cxl/devices/device-types.rst.txt"} |
پس از کامپایل و نصب خروجی مانند زیر خواهید داشت.
برای استفاده از SSL لازم است تابع زیر را از مسیر (/components/ql-application/init/ql_init.c) از حالت کامنت خارج کنید.
1 2 3 | #ifdef QL_APP_FEATURE_SSL ql_ssl_app_init(); #endif |
باتوجه به اینکه فایل (CAcert) را در SDcard قراردادم نیاز بود تا از تابع (ql_sdmmc_app_init();) که در پست قبل باهم بررسی کردیم استفاده کنیم که آن را هم از حالت کامنت خارج کردم و سپس به صورت زیر در کد تغییر ایجاد کردم. همچنین همینطور که مشاهده میکنید تنظیمات دیگر را عوض کردم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | static ql_task_t ssl_task = NULL; #define TEST_HOST_ADDR "www.webhook.site" #define TEST_HOST_PORT 443 #define TEST_SEND_DATA "GET /f7d6b6da-9f2d-4516-be7a-87fcc00d3093 HTTP/1.1\r\n" \ "Host: webhook.site\r\n" \ "User-Agent: Sisoog\r\n" \ "Connection: close\r\n\r\n" #define DTLS_TEST_HOST_ADDR "178.63.67.106" #define DTLS_TEST_HOST_PORT 8252 char *chain_path="SD:cacert.pem"; |
سپس نیاز است که تنظیمات مربوط به کانفیگ SSL به صورت زیر تغییر دهیم:
1 2 3 4 5 6 7 8 9 10 11 12 | ciphersuit[0] = QL_SSL_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256; // Recommended ciphersuit[1] = QL_SSL_TLS_RSA_WITH_AES_256_CBC_SHA; // Fallback ciphersuit[2] = 0; // End marker ql_ssl_conf_set(&ssl_cfg, QL_SSL_CONF_VERSION, QL_SSL_VERSION_ALL); ql_ssl_conf_set(&ssl_cfg, QL_SSL_CONF_TRANSPORT, QL_SSL_TLS_PROTOCOL); ql_ssl_conf_set(&ssl_cfg, QL_SSL_CONF_AUTHMODE, QL_SSL_VERIFY_SERVER); ql_ssl_conf_set(&ssl_cfg, QL_SSL_CONF_HS_TIMEOUT, 60); ql_ssl_conf_set(&ssl_cfg, QL_SSL_CONF_CIPHERSUITE, ciphersuit); ql_ssl_conf_set(&ssl_cfg, QL_SSL_CONF_CACERT, &chain_path, 1); // SNI (Server Name Indication) must be set to 1 (enabled) ql_ssl_conf_set(&ssl_cfg, QL_SSL_CONF_SNI, 1); |
پس از انجام تغییرات ذکر شده و کامپایل و نصب کد خروجی مانند زیر خواهید داشت.
امیدوارم از این آموزش استفاده کافی را برده باشید.
وبسایت: http://www.arvidtek.com
www.arvidtek.com | گروه مهندسی آرویدتک | فعال حوزه الکترونیک و مخابرات | فروشگاه تخصصی قطعات الکترونیک
مقالات بیشتر
نویسنده شو !
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.