SNI که مخفف عبارت Server Name Indication یا اعلانگر نام کارگزار است یک قابلیت اضافی در در پروتکل TLS است که به وسیله آن کاربر نام دامنه مورد نظری که تلاش برای برقراری ارتباط با آن دارد را از ابتدای شروع اتصال به سرور اعلام میکند.
این قابلیت به سرور اجازه میدهد تا با گواهینامه های مختلف بر روی یک IP و یک درگاه (port) فعالیت کند و وب سایت های مختلفی را در HTTPS میزبانی کند و لازم نیست که همه آن وب سایت ها گواهینامه یکسانی داشته باشند یا از IP های مختلفی استفاده کند.
پیش زمینه ای از مشکل
زمانی که یک اتصال TLS برقرار میشود، کاربر (client) یک گواهینامه دیجیتال از سرور درخواست میکند، پس از دریافت آن را مورد آزمایش و بررسی قرار میدهد تا ببیند که آیا نام آن مقصدی که قصد اتصال به آن داشته در این گواهینامه موجود است یا نه.اگر این اسم موجود بود، اتصال به روند عادی خود ادامه میدهد اما اگر این نام در گواهینامه دیجیتال موجود نبود ممکن است که اتصال قطع شود و کاربر با اخطاری مواجه شود که گواهینامه معتبر نیست و شاید یک حمله مرد میانی رخ داده. البته بعضی از نرم افزار ها این قابلیت را به کاربر میدهد که این اخطار را نادیده بگیرد و با مسئولیت کاربر به آن گواهینامه اعتماد کند و اتصال را از سربگیرد.
به هر حال در موقعیت های واقعی اینکه تمامی نام دامنه های میزبانی شده در سرور در یک گواهینامه ذکر شود، بسیار سخت یا حتی غیر ممکن است.سروری که چندین دامنه مختلف را میزبانی میکند نیازمند است که برای هر وب سایت یک گواهینامه معرفی کند.
میزبانی مبتنی بر نام دامنه این قابلیت را ایجاد میکند تا یک سرور بر روی یک IP چندین دامنه اینترنتی را میزبانی کند؛ برای بدست آمدن این امکان سرور میبایست درخواست کاربر را بخواند و نام دامنه مورد نظر را تشخیص دهد اما در زمان استفاده از HTTPS زمانی که اتصال در حال برقراری است این امکان برای سرور وجود ندارد، زیرا که سربرگ http بعد از اتصال کامل برای سرور ارسال میشود و تا آن زمان سرور به آن دسترسی ندارد؛ در نتیجه سرور نمیتواند که تشخیص دهد کاربر خواهان اتصال به کدام دامنه را دارد تا گواهینامه مربوط به همان دامنه را برایش ارسال کند؛ بنابراین عملا میزبانی چند وب سایت HTTPS بر روی یک آی پی غیر ممکن میشود.
از طرفی اگر قرار باشد هر وب سایتی از https برای ایمن سازی اتصال خود با کاربران استفاده کند،باید هر آی پی به یک دامنه تعلق بگیرد و این در حالیست که اختصاص IP ها باید از نظر سازمان RIR مورد تائید باشد و IP های نسخه 4 فرسوده هستند و عمرشان به زودی به پایان خواهد رسید.
هرچند که IP های نسخه 6 به دلیل ظرفیت بسیار بالا با مشکل انقراض مواجه نیستند اما امروزه همچنان اکثر وب سایت ها بر بستر IPv4 میزبانی میشود و از یک اتصال ایمن محروم خواهند بود.
SNI چگونه مشکل را برطرف کرد؟
SNI این مشکل را با ارسال نام دامنه مورد نظر کاربر به سرور در بدو اتصال TLS حل کرد.این کار باعث شد تا سرور از همان ابتدای اتصال متوجه شود که کدام گواهینامه مناسب درخواست کاربر است.
این راه حل در نتیجه باعث شد تا تعداد نامحدودی از وب سایت های HTTPS بتوانند در یک IP و درگاه (port) یکسان بتوانند با گواهینامه های مختلف میزبانی شوند.
این قابلیت اولین بار در ماه جوئن 2003 تحت عنوان RFC 3546 به قوانین اینترنتی اضافه شد وآخرین نسخه استاندارد آن RFC 6066 است.
پیاده سازی
در سال 2004 یک وصله (Patch) که در پروژه EdelKey آماده شده بود برای پشتیبانی SNI به OpenSSL اضافه شد.دو سال بعد در 2006 این وصله به نسخه (branch) در حال توسعه OpenSSL اضافه شد و در سال 2007 بصورت رسمی در نسخه 0.9.8 این برنامه معرفی شد.
برای اینکه یک برنامه قابلیت SNI را پیاده سازی کند باید TLS آن را پیاده سازی کرده باشد و نام دامنه مورد درخواست به کتابخانه TLS ارسال شود. بصورت دقیقتر کتابخانه TLS میتواند به برنامه الحاق شود یا اینکه بصورت یک قابلیت در سیستم عامل موجود باشد و به همین دلیل ممکن است بعضی از مرورگر ها این قابلیت را در هر سیستم عاملی و بعضی دیگر فقط این قابلیت را در سیستم عامل های خاصی پشتیبانی کنند.
پشتیبانی
نرم افزار | نوع | پشتیبانی میشود؟ | تذکرات | سال پشتیبانی |
---|---|---|---|---|
Internet Explorer | مرورگر وب | بله | از نسخه 7 در ویندوز Vista ( در ویندوز XP پشتیبانی نمیشود) | 2006 |
Mozilla Firefox | مرورگر وب | بله | از نسخه 2.0 | 2006 |
cURL | کتابخانه و ابزار خط فرمان | بله | از نسخه 7.18.1 | 2008 |
Safari | مرورگر وب | بله | در ویندوز XP پشتیبانی نمی شود. | |
Google Chrome | مرورگر وب | بله | از نسخه 6 | 2010 |
BlackBerry 10 | مرورگر وب | بله | در تمامی نسخه BB10 پشتیبانی میشود. | 2013 |
BlackBerry OS | مرورگر وب | خیر | در نسخه های قبل از 7.1 پشتیبانی نمیشود. | |
elinks | مرورگر وب | خیر | در نسخه های قبل از 0.12pre6 پشتیبانی نمیشود. | |
Windows Mobile | مرورگر وب | بله | تقریبا بعد از نسخه 6.5 | |
مرورگر پیشفرض Android | مرورگر وب | بله | از نسخه 3 برای تبلت ها و از نسخه 4 برای تلفن های همراه | 2011 |
wget | ابزار خط فرمان | بله | از نسخه 1.14 | |
مرورگر نوکیا برای Symbian | مرورگر وب | خیر | ||
مرورگر Opera برای Symbian | مرورگر وب | خیر | در سری 60 پشتیبانی نمیشود. | |
IBM HTTP Server | کارگزار وب | بله | از نسخه 9.0.0 | |
Apache Tomcat | کارگزار وب | بله | در نسخه های قبل از 8.5 پشتیبانی نمیشود. | |
Apache HTTP Server | کارگزار وب | بله | از نسخه 2.2.12 | 2009 |
Microsoft IIS | کارگزار وب | بله | از نسخه 8 | 2012 |
nginx | کارگزار وب | بله | از نسخه 0.5.23 | 2007 |
Jetty | کارگزار وب | بله | از نسخه 9.3.0 | 2015 |
Qt | کتابخانه | بله | از نسخه 4.8 | 2011 |
Mozilla NSS server side | کتابخانه | خیر | ||
4th Dimension | کتابخانه | خیر | در نسخه های قبل از 15.2 پشتیبانی نمیشود. | |
Java | کتابخانه | بله | از نسخه 1.7 | 2011 |
ColdFusion / Lucee | کتابخانه | بله |
ColdFusion از نسخه 10 آپدیت 18 و نسخه 11 آپدیت 7 Lucee از نسخه 4.5.1.019، نسخه 5.0.0.50 |
2015 |
Erlang | کتابخانه | بله | از نسخه r17 | 2013 |
Go | کتابخانه | بله | از نسخه 1.4 | 2011 |
Perl | کتابخانه | بله | از نسخه 1.50 Net::SSLeay و نسخه 1.56 IO::Socket::SSL | 2012 |
PHP | کتابخانه | بله | از نسخه 5.3 | 2014 |
Python | کتابخانه | بله | از نسخه 2.7.9rc1 و 3.2alpha4 |
2011 برای نسخه 3 2014 برای نسخه 2 |
Ruby | کتابخانه | بله | از نسخه 2.0 | 2011 |
منبع: WikiPedia
0 دیدگاه
نوشتن دیدگاه