تکنولوژی SNI چیست و چه کاری انجام میدهد؟

در این مقاله میخوانید
تکنولوژی SNI چیست؟ نشانگر نام سرور یا SIN مخفف عبارت Server Name Indication و توسعهدهنده پروتکل TLS است. این تکنولوژی نشان میدهد که در ابتدای فرایند دستدهی (Handshaking)، مرورگر با کدام Hostname ارتباط برقرار کرده است. استفاده از این تکنولوژی به سرور امکان میدهد تا چندین گواهینامه SSL را به یک آدرس IP و گیت متصل کند. در این مطلب از بلاگ پارس پک، به پرسش «SNI چیست؟» پاسخ میدهیم و به تمام نکات موجود در این زمینه اشاره میکنیم.
قبل از تکنولوژی SNI، اوضاع چطور بود؟
هنگامیکه کاربر از وبسایت شما بازدید میکند، مرورگر کاربر به وب سرور متصل میشود و نام دامنه را برای آن ارسال میکند. بااینحال، وقتی بخواهیم اتصالی را براساس پروتکل SSL/TLS انجام دهیم، فرایند اندکی پیچیدهتر میشود؛ زیرا مرورگر قبل از هرچیز و حتی پیش از اینکه بخواهد بداند که قرار است به کدام صفحه دسترسی پیدا کند، به گواهی دیجیتال از سمت سرور نیاز دارد. بعد از اینکه مرورگر این گواهی را دریافت کرد، نام روی این گواهی را با نام صفحهای که قرار است به آن دسترسی پیدا کند، مقایسه میکند و اگر این نامها با یکدیگر مطابقت داشته باشند، اتصال بهصورت معمول انجام خواهد شد.
حال اگر این دو نام با یکدیگر مطابقت نداشته باشند، چه اتفاقی خواهد افتاد؟ در این صورت، کاربر نمیتواند به وبسایت شما دسترسی پیدا کند و پیغام هشداری را مشاهده خواهد کرد. درادامه نیز، باتوجهبه اینکه اتصال ناموفق ممکن است نشاندهنده حمله مرد میانی (Man in The Middle) باشد، احتمالاً از ادامه فرایند جلوگیری خواهد شد.
برای جلوگیری از این رخداد، وبسایتهایی که با خرید ssl، از این پروتکل استفاده میکنند، باید آدرس IP خود را نیز داشته باشند. این موضوع به وب سرور امکان خواهد داد تا از آدرس IP برای بررسی این موضوع استفاده کند که بازدیدکننده قصد دارد به کدام وبسایت متصل شود و نیز گواهی دیجیتالی مناسب را برای مرورگر یا کلاینت ارسال کند.
راهحلی به نام تکنولوژی SNI
مشکل از جایی شروع میشود که آدرس IPها محدود است؛ بههمیندلیل، الزام هر وبسایت به داشتن آدرس IP منحصربهفرد باتوجهبه رشد بسیار سریع وبسایتها، ممکن است در درازمدت باعث ایجاد مشکل شود. راهحل این مشکل در دستان تکنولوژی SNI است.
مرورگرهایی که از تکنولوژی SNI پشتیبانی میکنند، در طول راهاندازی ایمن بلافاصله نام وبسایتی که بازدیدکننده قصد دارد به آن متصل شود، برای سرور ارسال میکند. بنابراین، سرور حالا دیگر میداند که کدام گواهی را باید برای مرورگر کاربر ارسال کند. این موضوع هم به مرورگرها و هم به سرورهای پشتیبان SNI امکان میدهد تا چندین گواهی را برای چندین Domain Name به یک آدرس IP متصل کنند.
در پاسخ به پرسش SNI چیست؟، بهطورخلاصه باید بگوییم که تکنولوژی SNI فناوری کاملاً جدیدی است که اجرای آن از سال ۲۰۰۴ تا ۲۰۰۷ بهطول انجامید. مشکل موجود در پیادهسازی این تکنولوژی آن بود که از یک طرف کتابخانه TLS باید برنامه TLS را درون خود میداشت و از طرف دیگر این کتابخانه باید نام هاست را به کتابخانه TLS نیز ارسال میکرد.
علاوهبراین، این امکان وجود دارد که کتابخانه TLS در اپلیکیشنها گنجانده شود یا جزء سیستمعامل مدنظر باشد؛ بههمیندلیل، برخی از مرورگرها تکنولوژی SNI را هنگام اجرا روی هر سیستمعاملی پیادهسازی میکنند؛ اما برخی دیگر از آنها این تکنولوژی را صرفاً روی سیستمعاملهای خاصی اجرا میکنند.
گواهینامه SSL چیست و چگونه کار میکند؟ مزایا و معایب SSL چیست؟ در مقاله زیر بخوانید.
مزایا و معایب استفاده از تکنولوژی SNI
مزایایی که استفاده از SNI برایتان بههمراه خواهد داشت؛ عبارتاند از:
- استفاده از یک IP/Port واحد برای تمامی وباپلیکیشنها بدون نیاز به اختصاصدادن IP منحصربهفرد یا پورت غیرپیشفرض
- امکان استفاده از گواهینامه واحد برای هر وباپلیکیشن که این موضوع نیز درمقایسهبا زمانیکه از گواهی SSL Wildcard استفاده میکنید، امنیت و سادگی بیشتری برایتان ایجاد خواهد کرد.
ناگفته نماند که تکنولوژی همیشه بدون عیب و ایراد نیست و هر فناوری کاستیهای مربوط به خود را دارد و این شما هستید که بهعنوان کاربر تکنولوژی با درنظرگرفتن معایب و مزایای آنها، تصمیم بگیرید که میخواهید از آن استفاده کنید یا خیر.
یکی از مشکلات مهم SNI این است که پروتکل WebDAV از آن پشتیبانی نمیکند. اگر اولینبار است که نام WebDAV را میشنوید، بهتر است بدانید که این پروتکل نسخه بهبودیافته HTTP است و حالا احتمالاً بهتر متوجه مشکل SNI میشوید.
کدام مرورگرها با تکنولوژی SNI سازگار و کدامیک ناسازگارند؟
برخی از سیستمعاملها و مرورگرها با تکنولوژی SNI سازگار نیستند؛ ازجمله:
- Windows XP با هر نسخه نصبشده از Windows Explorer روی آن
- نسخههای قدیمیتر از نسخه ششم Internet Explorer
- مرورگر Safari درصورتیکه روی سیستمعامل Windows XP نصب شده باشد
- مرورگر BlackBerry
- نسخههای قدیمیتر از ۶.۵ ویندوز موبایل
- مرورگر نوکیا و Opera برای سیستمعامل Symbian
درصورتیکه با هریک از این ترکیبات بخواهید به وبسایتی وصل شوید که از پروتکل HTTPS استفاده میکند، وبسایت همچنان دردسترس شما خواهد بود؛ اما پیغام خطایی مبنیبر تطابقنداشتن گواهی نیز برای شما بهنمایش درخواهد آمد.
راهحل پیشنهادی برای این مشکل، آن است که از مرورگر دیگری استفاده کنید که از تکنولوژی SNI پشتیبانی میکند. درهرصورت، اگر بخواهید همچنان با همان مرورگر ناسازگار روند کار را ادامه دهید، وبسایت درخواستی معمولاً با HTTPS باز خواهد شد؛ اما از گواهی متفاوتی برای اتصال ایمن استفاده میشود. بههرحال، باید بدانید که تمامی کاربران پس از واردکردن آدرس وبسایت، با همین پیغام هشدار مواجه خواهند شد که شاید برای برندتان چندان مناسب نباشد. بههمیندلیل، پیشنهاد میکنیم از یکی از مرورگرهای سازگار با این تکنولوژی استفاده کنید. درادامه، فهرست این مرورگرها را آوردهایم:
- مرورگر Internet Explorer نسخه ۷ یا جدیدتر که روی یکی از سیستمعاملهای Windows Vista یا نسخههای جدیدتر نصب شده باشد
- مرورگر Mozilla Firefox 2 یا جدیدتر
- مرورگر Opera 8.0 یا جدیدتر (درصورت استفاده از این مرورگر، پروتکل TLS 1.1 باید فعال شده باشد)
- مرورگر Opera Mobile با حداقل نسخه 10.1 Beta روی سیستمعامل اندروید
- Google Chrome نصبشده روی سیستمعامل Windows Vista یا نسخههای جدیدتر
- Google Chrome نسخه ۶ یا جدیدتر (درصورتیکه سیستمعامل شما Windows XP باشد)
- مرورگر Safari 3.0 یا نسخههای جدیدتر
نحوه پیکربندی تکنولوژی SNI
پس از اینکه فهمیدید SNI چیست، در گام بعدی باید ساخت SNI یا بهعبارتدیگر پیکربندی آن را یاد بگیرید. اولین نکتهای که باید به آن توجه کنید، این است که SNI به گواهیهای X509 نیاز دارد. بنابراین، اولین قدم آن است که این گواهی را در فایل پیکربندی Mbed TLS خود فعال کنید:
./scripts/config.py set MBEDTLS_X509_CRT_PARSE_C ./scripts/config.py set MBEDTLS_SSL_SERVER_NAME_INDICATION
این موارد گزینههای معمول در زمان کامپایل Mbed TLS هستند؛ بنابراین، باید آنها را قبل از کامپایلکردن کتابخانه تنظیم کنید. در گام بعدی، باید تکنولوژی SNI را هم در سمت کلاینت و هم در سمت سرور پیکربندی کنید. نحوه انجام این کار نیز درادامه توضیح داده شده است.
۱. پیکربندی تکنولوژی SNI در سمت کلاینت
اکستنشن SNI از همان Server Name کلاینت برای تأیید گواهی سرور در هنگام فرایند دستدهی استفاده میکند؛ ازاینرو، میتوانید آن را در همان Function تنظیم کنید:
mbedtls_ssl_set_hostname( context, "virtualserver15.myhost.com" );
توجه: درصورتیکه Hostname با این تابع تنظیم نشده باشد، بدون آنکه متوجه شوید، Mbed TLS از تأیید گواهی کاملاً صرفنظر خواهد کرد؛ پس همیشه Hostname را با این تابع تنظیم کنید؛ حتی در مواقعی که از SNI استفاده نمیکنید.
۲. پیکربندی تکنولوژی SNI در سمت سرور
Mbed TLS راهکاری بسیار انعطافپذیر برای انتخاب گواهی مناسب ارائه میدهد. توسعهدهنده Application Server باید تابع Callback را پیادهسازی کند. مثال زیر نمونه مناسبی از این موضوع است:
int sni_callback( void *p_info, mbedtls_ssl_context *ssl, const unsigned char *name, size_t name_len ) { const sni_entry *cur = (const sni_entry *) p_info; /* traverse the certificate info list */ while( cur != NULL ) { /* find the one with the name requested */ if( name_len == strlen( cur->name ) && memcmp( name, cur->name, name_len ) == 0 ) { /* set the corresponding CA if applicable */ if( cur->ca != NULL ) mbedtls_ssl_set_hs_ca_chain( ssl, cur->ca, cur->crl ); /* set the authentication mode if it differs from the default */ if( cur->authmode != DFL_AUTH_MODE ) mbedtls_ssl_set_hs_authmode( ssl, cur->authmode ); /* set the certificate in the context */ return( mbedtls_ssl_set_hs_own_cert( ssl, cur->cert, cur->key ) ); } /* step to the next certificate info in the list */ cur = cur->next; } /* certificate not found: return an error code */ return( -1 ); }
همچنین برای فعالسازی Mbed TLS با استفاده از فانکشن Callback، باید آن را ثبت کنید. این کار نیز با استفاده از کدهای زیر امکانپذیر است:
mbedtls_ssl_conf_sni( &conf, sni_callback, sni_info );
جمعبندی
تکنولوژی SNI چیست؟ SIN (مخفف عبارت Server Name Indication) فناوری جدیدی در حوزه امنیت وب است. با استفاده از این تکنولوژی مشخص میشود که در شروع فرایند دستدهی (Handshaking)، باید به کدام هاست متصل شد. البته مفهوم SNI بسیار پیچیدهتر است؛ بههمیندلیل در این مطلب از بلاگ پارس پک، توضیح دادیم که SNI چیست و نکات مهم مرتبط با این تکنولوژی را بیان کردیم و نحوه فعالسازی آن را نیز شرح دادیم.
سؤالات متداول
۱. چرا استفاده از تکنولوژی SNI مهم است؟
تکنولوژی SNI در فرایند دستدهی SSL/TLS گنجانده شده است تا اطمینان حاصل شود سرویسگیرندهها (مثل مرورگرها) میتوانند به گواهی صحیح SSL برای وبسایت مدنظر دسترسی پیدا کنند.
۲. کاربرد SNI چیست؟
درصورتیکه بخواهید چند دامنه را با استفاده از یک آدرس IP ایمن کنید، استفاده از تکنولوژی SNI گزینه مناسبی برای شماست. معمولاً استفاده از این فناوری ارزانتر از گواهی سنتی Wildcard است.
۳. چطور میتوان مطمئن شد که گواهی SNI بهدرستی کار میکند؟
راهکار ساده برای مطمئنشدن از کارکرد درست SNI این است دو دامنهای را امتحان کنید که به یک آدرس آیپی Resolve میشوند. اگر هر دو از پروتکل HTTPS استفاده کنند، یعنی فناوری SNI بهدرستی کار میکند.
۴. چطور میتوان SNI را غیرفعال کرد؟
برای غیرفعالسازی SNI، کافی است مقدار مشخصشده jsse. enableSNIExtension در کامپوننت Message Processor را به False تغییر دهید.