در این مطلب به ابن موضوع میپردازیم که SNI چیست و چرا باید از آن استفاده کنیم. در دنیای امروز، امنیت در اینترنت از اهمیت بالایی برخوردار است. یکی از راههای ارتقای امنیت، استفاده از پروتکل TLS (Transport Layer Security) است که قبلاً با نام SSL (Secure Sockets Layer) شناخته میشد. TLS برای ایجاد یک کانال امن بین مرورگر وب شما و وبسایتی که به آن مراجعه میکنید استفاده میشود و از دادههای شما در برابر جاسوسی و شنود محافظت میکند. با این حال، در گذشته، هر وبسایت برای استفاده از TLS به یک آدرس IP اختصاصی نیاز داشت.
این امر محدودیتهایی را ایجاد میکرد، زیرا میزبانی چندین وبسایت در یک سرور با آدرس IP واحد را دشوار میکرد. در اینجا SNI (Server Name Indication) وارد میشود.
SNI یک افزونه برای TLS است که به وبسرورها اجازه میدهد تا چندین وبسایت را با استفاده از یک آدرس IP واحد میزبانی کنند. این کار با ارسال نام میزبان وبسایت مورد نظر توسط مرورگر به عنوان بخشی از فرآیند دستدهی TLS انجام میشود. با استفاده از SNI، وبسرور میتواند گواهی SSL صحیح را برای هر وبسایت انتخاب و ارائه کند، حتی اگر همه آنها از یک آدرس IP استفاده کنند.
نشانهگذاری نام سرور یا SNI چیست؟
SNI یا «نشانهگذاری نام سرور» (Server Name Indication) یک توسعه بر روی پروتکل امنیتی «حمل و نقل لایه امن» (Transport Layer Security) یا TLS است. این قابلیت به کلاینت یا مرورگر این امکان را میدهد که در ابتدای برقراری اتصال امن (Handshake) نام میزبان (Hostname) سایتی که قصد برقراری ارتباط با آن را دارد، مشخص کند.
با استفاده از SNI، سرور میتواند در یک آدرس IP و شماره پورت (معمولا ۴۴۳ برای HTTPS) چندین گواهینامه امنیتی مختلف ارائه دهد. این امر باعث میشود تا چندین وبسایت امن (HTTPS) یا هر سرویس دیگری که از TLS استفاده میکند، روی یک آدرس IP واحد میزبانی شوند بدون اینکه نیاز باشد همه این سایتها از یک گواهینامه مشترک استفاده کنند.
به بیان ساده، SNI معادل مفهومی میزبانی مجازی مبتنی بر نام در HTTP/1.1 است، اما برای اتصالات HTTPS کاربرد دارد. میزبانی مجازی مبتنی بر نام به چندین hostname این امکان را میدهد که توسط یک سرور واحد (معمولاً یک وب سرور) روی یک آدرس IP میزبانی شوند. سرور برای انتخاب وبسایت مناسب از نام میزبان که توسط کلاینت در بخشی از پروتکل ارائه میشود (در HTTP این نام در هدر Host قرار دارد) استفاده میکند. با این حال، هنگام استفاده از HTTPS، Handshake TLS قبل از اینکه سرور هر هدر HTTP را ببیند اتفاق میافتد. بنابراین، برای سرور این امکان وجود نداشت که از اطلاعات موجود در هدر Host HTTP برای تصمیمگیری در مورد ارائه گواهینامه استفاده کند و به همین دلیل تنها نامهایی که تحت پوشش یک گواهینامه مشترک قرار داشتند، میتوانستند از یک آدرس IP واحد ارائه شوند.
با معرفی SNI، این محدودیت برطرف شده است و اکنون سرور میتواند با توجه به نام سایتی که کلاینت قصد برقراری ارتباط با آن را دارد، گواهینامه امنیتی مناسب را ارائه دهد و در نتیجه اتصالات امن و قابل اعتمادی را برقرار سازد.
ویژگیهای SNI چیست؟
SNI (Server Name Indication) دارای چندین ویژگی کلیدی است که آن را به یک ابزار ارزشمند برای میزبانی وب امن تبدیل میکند:
1. استفاده کارآمد از آدرسهای IP: نشانگر نام سرور یا SNI به وبسرورها اجازه میدهد تا چندین وبسایت را با استفاده از یک آدرس IP واحد میزبانی کنند. این امر به ویژه برای ارائهدهندگان هاستینگ که نیاز به میزبانی تعداد زیادی وبسایت برای مشتریان خود دارند، مفید است.
2. مدیریت آسان گواهیهای SSL: با امکان استفاده از گواهی SSL منحصر به فرد برای هر وبسایت، SNI مدیریت گواهیهای SSL را آسانتر میکند. این امر امنیت را افزایش میدهد و نیاز به پیکربندیهای پیچیده را از بین میبرد.
3. بهبود عملکرد: SNI میتواند به بهبود عملکرد وبسایتها کمک کند. با استفاده از SNI، وبسرور میتواند به سرعت گواهی SSL صحیح را برای هر درخواست شناسایی و ارائه کند، که به کاهش زمان بارگذاری صفحه کمک میکند.
4. سازگاری با مرورگرهای مدرن: SNI توسط اکثر مرورگرهای وب مدرن، از جمله Chrome، Firefox، Edge و Safari پشتیبانی میشود. این امر تضمین میکند که وبسایتهای شما برای اکثر کاربران به طور ایمن و قابلدسترسی باشند.
5. یکپارچهسازی با پروتکلهای امنیتی دیگر: SNI به خوبی با سایر پروتکلهای امنیتی مانند HTTP/2 و TLS 1.3 کار میکند. این امر به شما امکان میدهد تا از بالاترین سطح امنیت برای وبسایتهای خود استفاده کنید.
6. نصب و پیکربندی آسان: پیکربندی SNI در اکثر وبسرورهای محبوب مانند Apache و Nginx نسبتاً آسان است.
در مجموع، SNI یک ابزار ارزشمند است که مزایای متعددی را برای وبسایتها ارائه میدهد. این به ویژه برای وبسایتهایی که نیاز به میزبانی چندین دامنه در یک سرور با یک آدرس IP واحد دارند، یا وبسایتهایی که نیاز به استفاده از گواهیهای SSL منحصر به فرد دارند، مفید است.
چرا از SNI استفاده کنیم؟
از آنجایی که آدرسهای IP یک منبع محدود به حساب میآیند، SNI از این نظر که آنها را حفظ میکند اهمیت دارد. در زیر به چند مورد اشاره کردیم تا بهتر متوجه شوید دلایل استفاده از SNI چیست.
تسهیل مدیریت گواهیهای SSL/TLS
SNI فرایند مدیریت گواهیهای SSL/TLS را برای مدیران و صاحبان وبسایت آسانتر میکند، زیرا دیگر نیازی به خرید و تنظیم یک آدرس IP منحصربهفرد برای هر وبسایتی که به خرید SSL و رمزگذاری SSL/TLS نیاز دارد وجود نخواهد داشت.
میزبانی از چندین گواهی TLS
با کمک تکنولوژی SNI سرورها میتوانند چندین گواهی TLS را برای چندین وبسایت مختلف میزبانی کنند که همهی آنها تحت یک آدرس IP واحد هستند.
افزایش امنیت
با استفاده از SNI، نمیتوان با اسکن کردن یک آدرس IP به جزئیات گواهی دسترسی پیدا کرد. این امر به افزایش امنیت منجر میشود.
نام میزبان یا HostName چیست؟
نام میزبان (Hostname) در SNI به نام دامنه یا آدرس IP سروری اشاره دارد که یک کلاینت میخواهد با آن از طریق HTTPS و به صورت امن ارتباط برقرار کند. دستگاهی که به شبکه متصل است با Hostname خود شناسایی میشود. نام دامنه یا نام یک وبسایت، نوعی Hostname در بستر اینترنت است. هم Hostname دستگاه و هم نام دامنه از آدرس IP مرتبط با نام دامنه مستقل هستند.
نام میزبان مجازی یا Virtual Hostname چیست؟
در مبحث SNI (نشانگر نام سرور)، نام میزبان مجازی به نام دامنهای اشاره میکند که توسط کاربر در طی فرآیند هندشیک SSL/TLS ارائه میشود. این نام دامنه، سروری را که کاربر قصد برقراری ارتباط با آن را دارد، مشخص میکند. این سناریو زمانی رخ میدهد که چندین میزبانی مجازی بر روی یک آدرس IP واحد و پورت مشترک، با استفاده از میزبانی مجازی مبتنی بر نام، راهاندازی شده باشند.
میزبانی مجازی، نام دامنهای است که بر روی یک سرور به همراه دیگر نامهای دامنه میزبانی میشود و به تنهایی دارای آدرس IP اختصاصی نیست. مفهوم «مجازی» بودن آن، مشابه واقعیت مجازی است که تنها به صورت دیجیتالی وجود دارد و در دنیای واقعی تجسم فیزیکی ندارد. به عبارت دیگر، میزبانی مجازی وابستگی به یک سرور فیزیکی خاص را ندارد.
پسوند TLS SNI چه کاری انجام میدهد؟
پروتکل امن انتقال (TLS) برای برقراری اتصالات امن و رمزگذاریشده بین کاربر (کلاینت) و سرور در بستر اینترنت مورد استفاده قرار میگیرد. نشانگر نام سرور (SNI) یک الحاقیه بر روی پروتکل TLS است که به کاربر امکان میدهد تا نام دامنه (آدرس قابل فهم انسان برای وبسایت) سروری که قصد برقراری ارتباط با آن را دارد، طی فرآیند هندشیک SSL/TLS مشخص نماید.
به طور معمول، یک وبسرور مسئولیت مدیریت چندین نام دامنه (نام وبسایتها) را بر عهده دارد. در صورتی که این وبسایتها از پروتکل امن HTTPS استفاده کنند، هر نام دامنه دارای یک گواهینامه منحصر به فرد SSL خواهد بود. چالش اینجاست که تمامی نامهای دامنه تحت مدیریت یک سرور، یک آدرس IP مشترک دارند. این موضوع در ارتباط با پروتکل HTTP، مشکلی ایجاد نمیکند، زیرا به محض برقراری اتصال TCP، کاربر وبسایت مورد نظر خود را در درخواست HTTP مشخص مینماید.
با این حال، پروتکل HTTPS پیامهای HTTP را رمزگذاری میکند اما جایگزین پروتکل HTTP با پروتکل دیگری نمیشود. در عوض، پیش از آغاز تبادل اطلاعات بر بستر HTTP، نیازمند یک فرآیند هندشیک TLS است. بنابراین، بدون بهرهگیری از SNI، کاربر قادر به اعلام نام دامنه مورد نظر خود به سرور نخواهد بود. در نتیجه، سرور ممکن است گواهینامه SSL را برای یک نام دامنه اشتباه تولید نماید. در صورتی که نام موجود بر روی گواهینامه SSL با نام دامنهای که کاربر قصد دسترسی به آن را دارد، مغایرت داشته باشد، مرورگر کاربر با نمایش خطا، به طور معمول اتصال را قطع خواهد کرد.
SNI با الحاقه کردن نام دامنه به فرآیند دستدهی TLS، به برقراری ارتباط با نام دامنه صحیح و دریافت گواهینامه SSL مرتبط با آن کمک میکند. این امر سبب میشود تا فرآیند هندشیک TLS به طور عادی به اتمام برسد.
SNI چگونه کار میکند؟
در زیر مراحلی ذکر شده است که با بررسی آنها میتوانید متوجه شوید طرز کار SNI چیست.
مرحله اول: TLS Handshake
فرایند شروع ارتباط یا هندشیک TLS (امنیت لایه انتقال) بین کلاینت و سرور توسط کلاینت شروع میشود. در این مرحله، کلاینت از طریق پیام خوشآمدگویی کلاینت با سرور ارتباط برقرار میکند.
مرحله دوم: پیام خوشآمدگویی کلاینت
لیستی از تکرارهای پروتکل TLS پشتیبانیشده در پیام خوشآمدگویی کلاینت به همراه یک nonce که یک عدد تصادفی است گنجانده شده است. همچنین، این پیام حاوی سیگنالی است که تایید میکند کلاینت با پسوند SNI سازگار است.
مرحله سوم: مشخصات نام میزبان
با پیام خوشآمدگویی کلاینت، کلاینت در صورت پشتیبانی از SNI نام میزبان سروری را که میخواهد به آن متصل شود اضافه میکند.
مرحله چهارم: پیام خوشآمدگویی سرور
اگر سرور از SNI پشتیبانی کند، با یک پیام خوش آمدگویی پاسخ میدهد. گواهی SSL نام میزبان درخواستی، یک مقصود و نسخهی مربوط به پروتکل TLS همگی در پیام خوشآمدگویی سرور گنجانده شدهاند.
مرحله پنجم: تایید گواهی SSL
در مرحله هندشیک، کلاینت گواهی SSL را که سرور ارائه کرده است بررسی میکند. در صورتی که گواهینامه SSL قانونی و قابل اعتماد باشد، کلاینت رویه هندشیک TLS را تکمیل میکند.
مرحله ششم: درخواست HTTPS
هنگامی که کلاینت درخواست HTTPS را به سرور ارسال میکند، نام میزبان درخواستی در هدر میزبان HTTP گنجانده میشود. با توجه به پیکربندی میزبان مجازی مبتنیبر نام، این رویکرد باعث میشود تا سرور بتواند تصمیم بگیرد که کدام میزبان مجازی را ارائه دهد.
مرحله هفتم) سرویسدهی به میزبان مجازی
درخواست HTTPS توسط سرور پردازش میشود و سپس پاسخ مناسب را به کلاینت ارائه میدهد. SNI با اجازه دادن به میزبانی شدن تعداد زیادی از وبسایتهای دارای HTTPS بر روی یک آدرس IP و پورت واحد، کارایی میزبانی وب را افزایش میدهد.
کدام مرورگر از SNI پشتیبانی میکند؟
در زیر برخی از مرورگرهایی که از SNI پشتیبانی میکنند آورده شده است:
- گوگل کروم (نسخه 6 و بالاتر)
- موزیلا فایرفاکس (نسخه 2 و جدیدتر)
- مایکروسافت اج (همهی نسخهها)
- اپل سافاری (نسخه 3 و بالاتر)
- اپرا (نسخه 8 به بعد)
- مرورگر پیشفرض Android Tablet با اندروید 3.x (هانی کامب) و جدیدتر
- مرورگر وب بلک بری 10
- OpenSSL نسخه 0.9.8f و بالاتر
SNI رمزگذاریشده چیست؟
SNI رمزگذاریشده (ENSI) یک پسوند برای پروتکل TLS است که اطلاعات SNI ارسالشده توسط مشتری را در هنگام TLS Handshake رمزگذاری میکند. برای محافظت از دادههای وبگردی کاربر، نشانهی رمزگذاریشدهی سرور (ENSI) یک ویژگی ضروری است. این پسوند تضمین میکند که اشخاص ثالث نمیتوانند از رویه TLS Handshake برای ردیابی وبسایتهایی که کاربران بازدید میکنند سوءاستفاده کنند. همانطور که از نام این پسوند مشخص است، ENSI این کار را با رمزگذاری قسمت نشانگر نام سرور TLS انجام میدهد.
گواهی Wildcard چیست؟
یک گواهی منفرد با کاراکتر وایلدکارت «*» در قسمت نام دامنه به عنوان گواهینامه SSL/TLS شناخته میشود. در نتیجه، گواهی میتواند از میزبانها یا زیردامنههایی (Subdomain) که متعلق به یک دامنه پایه هستند محافظت کند.
مانند SANها، وایلدکارت یکی از ویژگیهای اضافی در گواهینامههای SSL است که پس از نصب SSL به دست میآورید. اگر وبسایت شما دارای چندین زیردامنه (مانند new.websitename.com و blog.websitename.com) باشد، خرید یک Wildcard SSL هم از نظر اقتصادی و هم کاربرد بسیار مفید است.
مزایای SNI چیست؟
اکنون که تا حدودی با ماهیت پسوند SNI و کاربرد آن آشنا شدهاید، اجازه بدهید به مزایای این پسوند اشاره داشته باشیم:
چندین گواهی SSL
SNI امکان میزبانی از چندین گواهینامه SSL بر روی یک آدرس IP واحد را میسر میکند. این امر میتواند در هزینههای میزبانی صرفهجویی کرده و نگهداری گواهی SSL را آسانتر کند.
امنیت پیشرفته
SNI ایمنسازی بسیاری از وبسایتها را آسانتر میکند.، اجازه استفاده از گواهینامههای SSL را در چندین دامنه میدهد و تایید اعتبار گواهی SSL را تضمین میکند که همهی اینها به افزایش امنیت وبسایت کمک میکند.
بهبود کارایی سرور
SNI نیاز به آدرسهای IP اختصاصی برای گواهینامههای SSL را کاهش میدهد. این امر باعث میشود تا تعداد آدرسهای IP موردنیاز کاهش یابد که در نتیجه به افزایش کارایی سرور منتهی میشود.
مدیریت بهتر وبسایت
SNI مدیریت بسیاری از وبسایتهایی که در یک سرور از گواهینامههای SSL مختلف برخوردارند را برای صاحبان وبسایت موثرتر میکند.
انعطافپذیری بیشتر
SNI تنظیمات و گزینههای مدیریتی بیشتری را برای مدیریت گواهیهای SSL در دسترس صاحبان وبسایتها قرار میدهد. این موضوع به ویژه برای وبسایتهای بزرگتر یا آن دسته از وبسایتهایی که نیازهای میزبانی پیچیدهای دارند بسیار مفید است.
میزبانی در دامنههای متعدد
با استفاده از SNI میتوانید بر روی یک سرور و آدرس IP واحد، چندین وبسایت را میزبانی و ایمن کنید. SNI تعمیر و نگهداری گواهی SSL را تسهیل میکند و هزینههای میزبانی را به طور قابل توجهی کاهش میدهد.
سازگاری
با SNI میتوانید بهراحتی وبسایتها را بدون تغییر پیکربندی یا دریافت آدرسهای IP بیشتر از سرور اضافه یا حذف کنید.
بهبود استفاده از منابع
استفاده بهتر از منابع، از جمله آدرسهای IP که میتواند پرهزینه و محدود باشد، توسط SNI امکانپذیر شده است. استفاده از آدرس IP یکسان برای چندین وبسایت، سرعت IPv4 را کاهش میدهد. IPv4 همان پروتکل اصلی است که به ما امکان اتصال به اینترنت را میدهد.
محدودیتهای SNI
مزایایی که SNI فراهم میکند قابل انکار نیست، اما این پسوند محدودیتهایی نیز دارد که در این بخش آنها را بررسی میکنیم.
عدم پشتیبانی از SNI رمزگذاریشده
در طول فرایند TLS Handshake، اطلاعات SNI به صورت متن ساده ارائه میشود که میتواند امکان دیدن نامه دامنهی وبسایتی که قصد دسترسی به آن را داریم برای افراد خارجی فراهم کند. SNI رمزگذاریشده (ENSI) میتواند برای غلبه بر این محدودیت مورد استفاده قرار بگیرد، اما در حال حاضر از این پسوند به طور گستردهای پشتیبانی نمیشود.
گواهی واحد به ازای هر آدرس IP
از آنجایی که تصمیمگیری SNI برای استفاده از یک گواهی به هندشیک SSL/TLS متکی است، برای هر آدرس IP فقط از یک گواهی میتوان استفاده کرد. در شرایطی که تعداد زیادی وبسایت با گواهیهای مختلف را بر روی یک آدرس IP میزبانی میکنید، این موضوع میتواند مشکلساز شود.
محدود به HTTPS
SNI فقط برای اتصالات HTTPS قابل اجرا است و هیچ مزیتی برای پروتکلهای دیگر مانند FTP یا SMTP ندارد.
پتانسیل برای پیکربندی نادرست
از آنجایی که SNI برای عملکرد درست به تنظیمات مناسب سرور متکی است، پیادهسازی نادرست میتواند به پیکربندی اشتباه منجر شود.
پشتیبانی محدود از مرورگر و سرور
هنگام تلاش برای دسترسی به وبسایتهایی که به SNI متکی هستند احتمال بروز مشکلات سازگاری وجود دارد، زیرا برخی از مرورگرها و سرورهای قدیمی ممکن است از SNI پشتیبانی نکنند.
احتمال آسیبپذیریهای امنیتی
حملاتی مانند حملات مرد میانی (MITM)، جعل DNS یا رهگیری ترافیک که ممکن است اطلاعات حساس کاربر را نشان دهد، میتواند SNI را مستعد آسیبپذیری کند.
یکی از چالشهای SNI این است که معمولا نمیتواند به سرعت راهحلهای غیر SNI یا آنهایی که از یک آدرس IP اختصاصی استفاده میکنند، عمل کند. علت این است که برای ایجاد یک اتصال امن، سرور باید یک فرایند اضافی را طی کرده و انتخاب کند که قرار است از کدام گواهی SSL/TLS استفاده کند.
این واقعیت که همهی مرورگرها و سرورهای وب از SNI پشتیبانی نمیکنند، یکی دیگر از چالشهای مهم SNI است. در صورت استفاده از مرورگرها یا پلتفرمهای قدیمیتر احتمالا مشکلاتی را در زمینه سازگاری تجربه میکنید که این امر میتواند به اشتباه یا نقص امنیتی منجر شود.
تفاوت بین SNI و SAN
با استفاده از SNI و SAN از چندین گواهی SSL در یک سرور پشتیبانی میکنند. بااینحال، رویکردی که برای این کار ارائه میدهند متفاوت است. SAN یک ویژگی گواهی است، درحالیکه SNI یک تکنیک سمتِ سرور است.
همانطور که میدانید، SNI به یک وب سرور اجازه میدهد تا چندین گواهی را در یک آدرس IP واحد میزبانی کند. براساس نام دامنه ارائهشده توسط کلاینت در درخواست اولیه، SNI سرور را قادر میسازد تا گواهی مناسب را هنگامی که کلاینت به آن متصل میشود انتخاب کند.
علاوهبراین، SAN یک ویژگی گواهی SSL است که امنیت نامهای دامنه متعدد را با نصب یک گواهی امکانپذیر میکند. فهرستی از نامهای دامنه اضافی (گاهی اوقات به آنها نامهای جایگزین موضوع یا Subject Alternative Names گفته میشود) که میتوانید با یک گواهی واحد آن را ایمن کنید، در گواهی SAN گنجانده شده است.
از نظر سازگاری، خوشبختانه اکثر سرورها و مرورگرهای وب در حال حاضر از SNI و SAN پشتیبانی میکنند. اما ممکن است برخی از سیستمهای قدیمی با آنها سازگاری نداشته باشند.
جمعبندی
در این مقاله، تقریبا تمام جوانب در خصوص نشانه نام سرور (SNI) مورد بحث قرار گرفته است. اکنون که با این پسوند TLS پرکاربرد بیشتر آشنا شدهاید میتوانید از SNI برای پروژهها و وبسایتهای خود بهره ببرید.
از آنجایی که SNI یک توسعه ضروری در محیط میزبانی وب فعلی محسوب میشود، اکثر سیستمها با آن سازگاری پیدا کردهاند. با توجه به اینکه HTTPS دیگر به استاندارد جدید وب تبدیل شده است، SNI فرایند تغییر از پروتکل قدیمی HTTP را تسهیل میکند.
سوالات متداول
کدام پروتکلها از SNI پشتیبانی میکنند؟
نشانه نام سرور (SNI) یک پسوند اضافی برای پروتکل TLS است. SNI در ابتدای فرایند TLS Handshake، یک کلاینت یا مرورگر را قادر میسازد تا نام میزبانی (Hostname) را که میخواهد به آن متصل شود مشخص کند. در نتیجه، سرور میتواند چندین گواهی را در یک پورت و آدرس IP واحد نمایش دهد.
آیا همهی وب سرورها و مرورگرها از SNI پشتیبانی میکنند؟
نام نشانه نام سرور (SNI) یک ارتقاء برای پروتکل TLS است که امکان میزبانی چندین گواهی SSL را در یک آدرس IP میسر میکند. اگرچه اکثر مرورگرهای مدرن این روزها از این پسوند پشتیبانی میکنند، اما مرورگرهای قدیمیتر با SNI سازگاری ندارند.
آیا مشکلات سازگاری با SNI وجود دارد؟
دامنهی صوری (Domain Fronting) از نظر سازگاری محدود است، زیرا کاملا در چارچوب استانداردی که SNI را تعریف میکند قرار نمیگیرد. در حال حاضر، سرویسهای مختلفی وجود دارد که اتصالاتی با SNI دامنهی صوری را به عنوان اتصال نامعتبر رد کرده و تایید میکنند که میزبان SNI با میزبان مشخصشده در هدر HTTP مطابقت داشته باشد.