بررسی جمع و جور پروتکل SSL

داشتم ریکان میکردم و با سرتیفیکت تارگت ور میرفتم، بعد زد به سرم که یه رایت آپ از SSL بنویسم ولی خستگیم اومد و بجاش اومدم یه چیز جمع جوری سر هم کردم.

بررسی جمع و جور پروتکل SSL

داشتم ریکان میکردم و با سرتیفیکت تارگت ور میرفتم، بعد زد به سرم که یه رایت آپ از SSL بنویسم ولی خستگیم اومد و بجاش اومدم یه چیز جمع جوری سر هم کردم.

اینو اگه نشون یه آدم آکادمیک بدید احتمالا منو با چوب میزنه چون خیلی ساده سازی کردم ولی خب خودمم شاید فقط یکمی بیشتر از این بلد باشم و همینا که اینجا نوشتم کارمو تا به امروز راه انداخته.

اگه میخوای داخل SSL/TLS عمیق بشی برو Bulletproof SSL and TLS بخون.

بریم سر اصل مطلب.

وقتی یه درخواست از سیستم شما میره سمت یه سروری، اینطوری نیست که درخواست زارت از لپتاپ شما بره برسه به سرور بلکه دیتا به یه سری پکت کوچیک تبدیل میشه و از کلی کامپیوتر و روتر و دیوایس بین راه رد میشه تا برسه مقصد و به هر کدوم از این توقف‌های بین راه هم میگن Hop.

حالا مشکل چیه؟

اگه اطلاعات به صورت الله بختکی ارسال بشن، هر کسی که وسط این مسیر باشه میتونه اونارو ببینه و دقیقا به همین دلیله که باید دیتا رمزنگاری بشه.

رمزنگاری یعنی چی؟ یعنی ریخت و قیافه‌ی دیتا رو عوض کنیم.

به عبارت دیگه، یعنی یه متن قابل خوندن رو تبدیل کنیم به یه چیزی که فقط کسی که کلید درست رو داره بتونه بخوندش.

طبیعتا این وسط فقط رمز کردن مهم نیست و الگوریتمی که استفاده میکنی هم باید خودش امن باشه وگرنه که کل داستان بی فایده میشه.

حالا این SSL سه تا هدف اصلی داره و کل امنیت SSL تقریبا روی سه تا مفهوم میچرخه.

محرمانگی (Confidentiality): یعنی کسی به صورت رندوم نتونه دیتای شما رو بخونه.

یکپارچگی (Integrity): یعنی کسی وسط راه نتونه اطلاعات رو تغییر بده.

اصالت (Authenticity): یعنی طرفت تایید بشه و مطمئن باشی با سرور اصلی در ارتباطی و نه یه مهاجم که خودش رو جای اون سایت معرفی کرده.

بعد ما دو مدل رمزنگاری داریم، یکی رمزنگاری متقارن و اینجا فقط یه کلید وجود داره. یعنی همون کلیدی که دیتا رو رمز میکنه، همونم دوباره بازش میکنه و مزیتش اینه که خیلی سریعه.

یکی از معروف‌ترین الگوریتم‌هایی که امروزه استفاده میشه AES هست.

دومی رمزنگاری نامتقارن هست و اینجا داستان فرق میکنه و به جای یه کلید، دو تا کلید داریم.

  • کلید عمومی یا Public Key

  • کلید خصوصی یا Private Key

کلید پابلیک رو به همه میدی ولی کلید پرایوت فقط پیش خودت میمونه.

اگه کسی بخواد یه پیام محرمانه برات بفرسته، میاد با Public Key شما رمزش میکنه و فقط تو میتونی با Private Key خودت بازش کنی.

حالا این داستان برعکس هم میتونه اتفاق بیفته و اگه من یه چیزی رو با Private Key خودم امضا کنم، همه میتونن با Public Key من بررسی کنن که واقعا خودم اون پیام رو امضا کردم یا نه.

به این داستان میگن Digital Signature و این دقیقا همون چیزیه که باعث میشه وقتی میری داخل Google، مرورگرت بفهمه واقعا با گوگل اصلی طرفه و سایت جعلی نیست.

حالا این SSL یه پروتکله که یه ارتباط امن بین کلاینت و سرور برقرار میکنه و البته که کارش فقط رمزنگاری نیست و سه تا کار مهم انجام میده:

  • هویت سرور رو تایید میکنه.

  • دیتا رو رمزنگاری میکنه.

  • مطمئن میشه کسی وسط راه نتونسته دیتا رو دستکاری کنه.

برای انجام این کار هم از ترکیب رمزنگاری متقارن و نامتقارن استفاده میکنه.

بعد هر سایتی که SSL داشته باشه، یه Certificate هم داره و داخل این Certificate معمولا این اطلاعات وجود داره:

  • این Certificate برای چه سایتی صادر شده.

  • تا چه تاریخی اعتبار داره.

  • کلید عمومی سایت

  • امضای دیجیتال Certificate Authority.

همین Certificate باعث میشه مرورگر بتونه هویت سایت رو بررسی کنه.

حالا سوال اینجاست...

از کجا معلوم این Certificate واقعیه؟

و اینجاست که CA وارد بازی میشه.

این CA یه سازمان قابل اعتماده که قبل از صدور Certificate بررسی میکنه این دامنه واقعا متعلق به همون صاحبشه یا نه و بعد از تایید، Certificate رو امضا میکنه.

به خاطر همین وقتی مرورگر امضای CA رو میبینه، به اون Certificate اعتماد میکنه و اگه این امضا وجود نداشته باشه یا Self-Signed باشه، مرورگر اخطار امنیتی نشون میده.

این اعتماد از کجا میاد؟ مرورگرها و سیستم عامل ها از قبل لیستی از CAهای معتبر دنیا رو داخل خودشون دارن و وقتی یه سایت Certificate خودش رو میفرسته، مرورگر امضاش رو با همین لیست بررسی میکنه.

اگه همه چیز درست باشه، اون قفل معروف کنار آدرس سایت ظاهر میشه.

حالا CAها معمولا خودشون مستقیم همه Certificateها رو امضا نمیکنن بلکه اختیارش رو میدن به یه سری Intermediate Certificate Authority یا همون ICA.

این کار یه دلیل خیلی مهم داره و اون اینه که اگه یه ICA هک بشه، فقط همون بخش کوچیکی که زیرمجموعه اش بوده آسیب میبینه ولی اگه خود CA اصلی هک بشه، ممکنه بخش بزرگی از اینترنت تحت تاثیر قرار بگیره.

برای همین این ساختار لایه‌ای امنیت رو خیلی بیشتر میکنه.

بعد اینکه وقتی اولین بار یه سایتی رو باز میکنی، یه هندشیک انجام میشه و خیلی خلاصه داستان اینه:

اول سرور Certificate خودش رو میفرسته و بعد مرورگر اون Certificate رو بررسی میکنه و بعد یه کلید متقارن تولید میکنه ( چون رمزنگاری متقارن خیلی سریع‌تره ) و بعدشم این کلید رو با Public Key سرور رمز میکنه و میفرسته.

اون سمتم فقط سرور Private Key مربوط رو داره و میتونه اون کلید رو باز کنه.

از این لحظه به بعد هر دو طرف اون کلید متقارن رو دارن و دیگه کل ارتباط به صورت رمزنگاری‌شده انجام میشه، و خب گاهی خود پیاده‌سازی SSL آسیب‌پذیره یکی از معروف‌ترین نمونه‌ها Heartbleed بود که میتونی بری راجع بهش سرج بزنی.

البته اونجا هم مشکل از پروتکل SSL نبود بلکه باگ داخل کتابخونه‌ای بود که SSL رو پیاده‌سازی کرده بود و باعث میشد مهاجم بتونه بخش‌هایی از مموری سرور رو بخونه.

جمع بندی اینکه، پروتکل SSL یعنی یه مجموعه از الگوریتم‌ها و Certificateها و امضای دیجیتال و مکانیزم‌های مختلف که کنار هم کار میکنن تا وقتی شما داری به جایی کانکت میشی، خیالت راحت باشه کسی وسط راه نمیتونه دیتات رو بخونه یا تغییرش بده و یا اینکه بیاد یه چیز جعلی نشونت بده.

پی نوشت: این متن رو بار اول در چهارم مرداد ماه ۱۴۰۵ در تلگرام پست کردم.