SNI Logo

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