پروتکل SSL/TLS چجوری کار میکنه و چطور یه ارتباط HTTPS رو امن میکنه؟ هفت خان SSL Handshake!
توی مقالهی قبلی که با عنوان «چه تفاوتی بین TLS، SSL و HTTPS وجود داره؟! داستان یک تولد!» منتشر شد، داستان جالب تولد SSL/TLS رو روایت کردم. توصیه میکنم اگر شماهم بین SSL و TLS سرگردونید ابتدا اون مقاله رو بخونید. در پایان اون مقاله خیلی خلاصه توضیح دادم که SSL/TLS در واقع با یه جفت کلید که بهشون کلیدهای عمومی و خصوصی میگیم و یه فرایند رفت و برگشتی موسوم به SSL Handshake کار میکنه، اما راستش SSL Handshake همچین اینقدرا هم ساده نیست و برای شکلگیری یه ارتباط امن باید هفت خان رو طی کرد! توی این مقاله میخوایم خیلی مفصلتر در مورد SSL Handshake صحبت کنیم که دقیقاً چه مراحلی طی میشه تا یک ارتباط امن مبتنی بر SSL/TLS ـ مثل HTTPS ـ بین کلاینت و سرور شکل بگیره.
مراحل SSL Handshake به این صورته که:
در ابتدا کلاینت که مثلاً میتونه مرورگر شما باشه، یه پیام به سرور میفرسته که اصطلاحاً بهش میگن Client Hello و شامل یه نوع Handshake که در اینجا Client Hello است، نسخهی TLSی که کلاینت ساپورت میکنه، لیست Cipherها یا همون الگوریتمهای رمزنگاریای که کلاینت پشتیبانی میکنه و یه سری دیتای دیگه و همینطور یه رشتهی تصادفی که بهش Client Random گفته میشه. در تصویر زیر من بخشی از مراحل SSL Handshake رو برای یک ارتباط HTTPS دنبال کردم. همونطور که میبینید نسخهی TLS کلاینت، رشتهی تصادفی و همینطور لیست الگورویتمهای رمزنگاری کلاینت در Client Hello قابل مشاهدهان.
در پاسخ به Client Hello، سرور هم یه پیام به کلاینت میفرسته که بهش میگن Server Hello که اون هم یه رشته تصادفی در خودش داره(Server Random) و همچنین شامل الگوریتم رمزنگاری انتخابی سروره.
کلاینت با استعلام از Certificate Authority مربوطه، SSL Certificate سرور رو اعتبارسنجی میکنه.
حالا کلاینت یه رشتهی تصادفی دیگه که بهش Premaster Secret گفته میشه و با استفاده از کلید عمومی رمزنگاری شده رو دوباره به سرور میفرسته و خب طبیعتاً فقط با کلید خصوصی میشه رمزگشاییش کرد و سرور هم که کلید خصوصی رو داره اونو رمزگشایی میکنه(Asymmetric Encryption).
توی این مرحله، هم کلاینت و هم سرور با استفاده از Client Random، Server Random و Premaster Secret یه Session Key ایجاد میکنن که خب قاعدتاً باید یکسان باشن.
حالا کلاینت یه پیام "finished" رو که با استفاده از Session Key رمزنگاریش کرده به سرور میفرسته و این جوری آمادگی خودش رو برای برقرای ارتباط امن به سرور اعلام میکنه.
سرور هم متقابلاً یه پیام "finished" به کلاینت میفرسته و اون هم آمادگی خودش رو اعلام میکنه.
بعد از این هفت مرحله، از اینجا به بعد دیگه کلاینت و سرور اطلاعات رو با همون Session Key رمزنگاری و رمزگشایی میکنن(Symmetric Encryption) و برای همدیگه ارسال میکنن.
لازم به توضیحه که به رمزنگاری با یک کلید و رمزگشایی با همون کلید، رمزنگاری متقارن(Symmetric Encryption) و به رمزنگاری با یک کلید و رمزگشایی با یک کلید دیگه، رمزنگاری نامتقارن(Asymmetric Encryption) گفته میشه. بنابراین رمزنگاری و رمزگشایی با کلیدهای عمومی و خصوصی رمزنگاری نامتقارن، و رمزنگاری و رمزگشایی با Session Key رمزنگاری متقارن محسوب میشن.