در گذشته و قبل از ابداع SSL، وبسایتها از یک IP اختصاصی استفاده میکردند، آن زمان کسی فکر نمیکرد که روزی IP نسخه 4 IPv4 به این زودی پر شود. اما با معرفی SSL به عنوان یک وصله امنیتی در TLS و افزایش تعداد وبسایتها، این نیاز بوجود آمد که آدرس IP ها بتوانند بصورت اشتراکی وبسایتها را برای مرورگر ارسال کنند. این یعنی مرورگر به یک سرور و یک آدرس IP متصل میشود و باید توسط یک نشانی اطلاعات وبسایت در دامنه مورد نظر را دریافت کند. این مسئله با کمک یک نشانه گذاری در سرور به نام SNI حل شد. اما SNI دقیقاً چیست و چه کاربردهایی دارد؟! در این مقاله به بررسی این فناوری و ارتباط آن با SSL خواهیم پرداخت.
SNI یا Server Name Indication چیست؟
نمیتوان بدون مقدمه در مورد SNI صحبت کرد. SNI را میتوان مانند یک پلاک داخلی در سرور اشتراکی برای هر وبسایت در نظر گرفت. مانند شماره واحدهای یک ساختمان. بهترین مثال برای توضیح SNI مثال "تحویل بسته پستی" است. تصور کنید که میخواهید یک بسته پستی را تحویل دهید. شما آدرس کامل مقصد و پلاک را میدانید، اما نمیدانید بسته را باید به کدام واحد تحویل دهید. در این حالت بهترین راهکار این است که از لابی ساختمان، بخش اطلاعات را پیدا کنید و از مأمور ساختمان، شماره واحد مورد نظر را بر اساس نام گیرنده، بدست آورید. SNI در سرورهای اشتراکی حکم مأمور ساختمان را ایفا میکند و دقیقاً همین کار را برای مرورگر انجام میدهد.
SNI مخفف عبارت "Server Name Indication" به معنی "نشانگر نام سرور" یا "نشان نام سرور" است. این فناوری، افزونهای برای پروتکل TLS (نسخه امنتر HTTP) محسوب میشود که در شروع ارتباط با مرورگر و یا به اصطلاح فنی (ابتدای فرایند دستدهی (handshake) بین مرورگر و سرور)، نام میزبان موردنظر را به عنوان بخشی از فرآیند رمزنگاری ارسال میکند. امروزه SNI هم در سرورها و هم در تمامی مرورگرهای مدرن بصورت پیشفرض فعال است که البته برای استفاده از SSL حتماً نیاز به فعال بودن SNI هم خواهید داشت و در واقع پیشنیاز استفاده از SSL است. به این نکته نیز توجه داشته باشید که در سرورهای اختصاصی نیز برای استفاده از SSL این فناوری باید فعال باشد. برای آشنایی کامل با ssl و مزایای آن میتوانید محتوای SSL چیست و چگونه کار می کند؟ مطالعه کنید.
کاربردهای SNI (Server Name Indication)
اما تنها کاربرد SNI نشانه گذاری نیست. SNI در زمینه امنیت سرور و بهبود تجربه کاربری نیز کاربرد دارد. در ادامه کاربردهای دیگر SNI را بررسی خواهیم کرد.
1. استفاده از چندین گواهینامه SSL برای چندین وبسایت روی یک IP
در گذشته، برای استفاده از گواهینامه SSL برای هر وبسایت، به یک IP اختصاصی نیاز بود. SNI این مشکل را حل کرد و به شما امکان میدهد تا از یک IP برای چندین وبسایت با گواهینامههای SSL جداگانه استفاده کنید. این امر باعث میشود که گواهینامه SSL یا TLS صحیح به کاربر ارائه شود و اتصال امن و رمزنگاری شده برقرار شود. اگرچه با ورود IPv6 مشکل تعداد IP ها حل شد، اما این فناوری کمک کرد تا از IPv4 هم بصورت بهینه استفاده شود و حجم سرویسها را در آن بطور چشمگیری افزایش دهد.
2. افزایش امنیت در پی استفاده از چندین SSL همزمان
SNI با ارسال نام میزبان در ابتدای فرایند handshake، به سرور کمک میکند تا گواهی SSL صحیح را به مرورگر ارائه دهد. این امر، امنیت اتصال را افزایش میدهد و از حملات هکری مانند "حمله مرد میانی" یا "man in the middle" جلوگیری میکند. اما این عمل توسط چندین SSL متصل به هر کدام از وبسایتها انجام میشود و در این شرایط تمامی راهها برای "حمله مرد میانی" بسته میشود.
3. کاهش هزینهها
تا قبل از فناوری SNI، وبسایتها میبایست بر روی سرورهای اختصاصی اجرا میشدند و همین امر هزینه زیادی را به همراه داشت. برای مثال هزینه نگهداری یک سرور اشتراکی ماهانه حدود 3 دلار است اما اگر بر روی سرور اختصاصی باشد، این مبلغ حداقل 3 برابر میشود. یعنی یک کامپیوتر کاملاً مجرا تنها برای اجرای یک وبسایت. اما با ابداع این فناوری هر سرور نه تنها میتواند چندین وبسایت را بصورت اشتراکی میزبانی کند، بلکه میتواند چندین سرور مجازی را هم پشتیبانی کند. در این حالت هزینه اجاره ماهانه سرور بین کاربران تقسیم میشود و هزینه نهایی بسیار پایین میآید.
فرآیندهای عملکرد SNI
همانطور که در پاراگراف بالا گفته شد، در گذشته هر وبسایت برای برقراری ارتباط امن با کاربران، از یک گواهینامه SSL منحصر به فرد استفاده میکرد و اگر چندین وبسایت با گواهینامههای مختلف روی یک آدرس IP قرار داشت، مشکلاتی به وجود میآمد. SNI یا Server Name Indication، مکانیزمی در پروتکل TLS است که به مرورگر و سرور کمک میکند تا در صورت استفاده از یک آدرس IP برای چندین وبسایت، گواهینامه SSL صحیح را انتخاب کنند. هنگامی که یک مرورگر به یک وبسایت متصل میشود، ابتدا یک اتصال TCP با سرور برقرار میکند. در این مرحله، مرورگر هنوز نمیداند که قصد دارد با کدام وبسایت (با نام دامنه خاص) ارتباط برقرار کند.
SNI این مشکل را با اضافه کردن یک مرحله اضافی به فرآیند اتصال حل میکند. قبل از برقراری اتصال TCP، مرورگر نام دامنه وبسایتی که میخواهد به آن متصل شود را به سرور ارسال میکند. از مزایای استفاده از SNI میتوان به امنیت و کارایی آن اشاره کرد. SNI تضمین میکند که مرورگر فقط گواهینامه SSL مربوط به وبسایت مورد نظر را دریافت میکند و این میتواند امنیت رمزنگاری هر کدام از وبسایتها را بطور جداگانه بالا ببرد و امنیت کلی سرور را تأمین کند. از طرفی SNI به سرور کمک میکند تا سریعتر وبسایت مورد نظر را شناسایی و به درخواست کاربر پاسخ دهد که همین امر کارایی سرور را نیز بالا میبرد و شرایط را برای ایجاد فضای اشتراکی فراهم میکند. همچنین کمک میکند ترافیک بطور یکسان بین همه وبسایتها و سرورها توزیع شود.
تاریخچه ساخت فناوری SNI
SNI یا Server Name Indication، در سال ۲۰۰۳ توسط گروهی از مهندسان در شرکتهای مایکروسافت، نتاسکیپ و سیسکو معرفی شد. هدف از توسعه این فناوری، حل مشکل امنیتی مربوط به استفاده از یک آدرس IP برای چندین وبسایت با گواهینامههای SSL مختلف بود.
مراحل توسعه SNI
-
در سال ۲۰۰۳ اولین پیش نویس SNI توسط گروهی از مهندسان در شرکتهای مایکروسافت، نتاسکیپ و سیسکو منتشر شد.
-
در سال ۲۰۰۶ SNI به عنوان یک استاندارد رسمی در RFC 4366 به تصویب رسید.
-
در سال ۲۰۰۸ پشتیبانی از SNI در مرورگرهای محبوب مانند Firefox و Chrome اضافه شد.
-
در سال۲۰۱۱ پشتیبانی از SNI در اکثر وبسرورها مانند Apache و Nginx اضافه شد.
نحوه فعالسازی SNI در سرور
همانطور که در پاراگراف بالا هم گفته شد، SNI بصورت پیشفرض در تمامی سرورها فعال است و اگر یک سرور از هاستینگ تهیه کنید، حتی SSL رایگان هم در اختیارتان قرار خواهند داد. اما در صورتی که بخواهید خودتان سرور اختصاصی خودتان را داشته باشید، باید خودتان اقدام به فعالسازی آن کنید. نحوه فعالسازی SNI در پلتفرمهای مختلف با هم کمی متفاوت است؛ اگرچه همه آنها از یک استاندارد واحد تبعیت میکنند. در ادامه نحوه فعالسازی SNI در سرور را بررسی میکنیم.
نحوه فعال سازی SNI در سیپنل
به طور پیش فرض، SNI در سی پنل فعال است. اما اگر به هر دلیلی غیرفعال شده باشد، می توانید به راحتی آن را فعال کنید. به این نکته نیز توجه داشته باشید که باید به پنل WHM دسترسی داشته باشید؛ در غیر این صورت به پشتیبان هاستینگ خود در این مورد پیام دهید. برای فعالسازی SNI مراحل زیر را دنبال کنید:
-
به WHM خود وارد شوید.
-
در نوار جستجو، عبارت "Tweak Settings" را جستجو کنید و آن را باز کنید.
-
در بخش "Security", به دنبال گزینه "Allow cPanel users to install SSL Hosts" بگردید.
-
تیک این گزینه را فعال کنید.
-
در آخر بر روی دکمه Save کلیک کنید.
نکته : اگر از WHM نسخه 11.60 یا بالاتر استفاده می کنید، گزینه "Allow cPanel users to install SSL Hosts" در بخش "Tweak Settings" به طور پیش فرض فعال است. اگر از WHM نسخه 11.54 یا پایین تر استفاده می کنید، باید این گزینه را به صورت دستی فعال کنید.
نحوه فعال سازی SNI در دایرکت ادمین
فعالسازی SNI در دایرکت ادمین کمی سخت تر از کنترلپنلهای دیگر است و از راه SSH انجام میشود. برای فعال سازی SNI در دایرکت ادمین، باید مراحل زیر را انجام دهید:
1. به SSH سرور خود متصل شوید.
2. فایل پیکربندی دایرکت ادمین را با استفاده از یک ویرایشگر متن باز کنید.
nano /usr/local/directadmin/conf/directadmin.conf
3. در فایل پیکربندی، به دنبال خطی بگردید که عبارت "enable_ssl_sni" در آن وجود دارد.
4. مقدار این خط را به "1" تغییر دهید.
5. فایل پیکربندی را ذخیره و ببندید.
6. سرویس دایرکت ادمین را ریستارت کنید.
service directadmin restart
نکته : اگر خط "enable_ssl_sni" در فایل پیکربندی وجود نداشت، می توانید آن را به صورت دستی اضافه کنید.
نحوه فعال سازی SNI در پلسک
SNI بصورت پیشفرض در کنترلپنل پلسک فعال است؛ اما اگر می خواهید از فعال بودن آن مطمئن شوید، می توانید مراحل زیر را انجام دهید:
-
به پنل کاربری پلسک خود وارد شوید.
-
به بخش "Tools & Settings" بروید.
-
روی "Server Settings" کلیک کنید.
-
در قسمت "Security", به دنبال گزینه "Turn on SNI support, which allow using individual SSL/TLS certificates on websites with the same IP address." بگردید.
-
اگر این گزینه فعال نیست، آن را فعال کنید.
-
روی "OK" کلیک کنید.
نکات : اگر از نسخه های قدیمی تر پلسک استفاده می کنید، ممکن است SNI به طور پیش فرض فعال نباشد.
نحوه فعال سازی SNI در لینوکس
در صورتی که از ابزارهای مدیریت هاستینگ مانند کنترلپنل استفاده نمیکنید، میتوانید با SSH در لینوکس SNI را فعال کنید:
-
به کمک SSH به سرور وصل شوید.
-
فایل پیکربندی را با دستور زیر باز کنید : vi /etc/psa/psa.conf
-
مقدار SNI_SUPPORT را به true تغییر دهید : SNI_SUPPORT true
-
پس از ذخیره تغییرات ، سرویس psa را ری استارت کنید : service psa restart
پیکربندی SNI در Mbed TLS
پس از آشنایی با SNI، نوبت به پیکربندی آن در Mbed TLS میرسد. SNI به گواهینامههای X509 نیاز دارد، بنابراین ابتدا باید این گواهینامه را در فایل پیکربندی Mbed TLS فعال کنید:
./scripts/config.py set MBEDTLS_X509_CRT_PARSE_C
./scripts/config.py set MBEDTLS_SSL_SERVER_NAME_INDICATION
گام اول : تنظیم SNI در سمت کلاینت
SNI از نام سرور کلاینت برای تأیید گواهی سرور در Handshake استفاده میکند. میتوانید آن را در تابع "mbedtls_ssl_set_hostname" تنظیم کنید:
mbedtls_ssl_set_hostname( context, "virtualserver15.myhost.com" );
نکته : اگر Hostname با این تابع تنظیم نشود، Mbed TLS بدون اطلاع شما تأیید گواهی را نادیده میگیرد. بنابراین همیشه Hostname را با این تابع تنظیم کنید، حتی اگر از SNI استفاده نمیکنید.
گام دوم: تنظیم SNI در سمت سرور
Mbed TLS راهکاری انعطافپذیر برای انتخاب گواهی مناسب ارائه میدهد. شما باید تابع 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 );
}
این تابع لیست گواهینامهها را بررسی میکند و گواهی مناسب را با نام سرور ارائه شده توسط کلاینت مطابقت میدهد.
همچنین برای فعالسازی Callback در Mbed TLS، از کد زیر استفاده کنید:
mbedtls_ssl_conf_sni( &conf, sni_callback, sni_info );
مثالهای ارائه شده فقط برای نشان دادن نحوه پیکربندی SNI هستند. شما باید کد را مطابق با نیازهای خودتان Anpassung کنید. برای اطلاعات بیشتر، به مستندات رسمی Mbed TLS مراجعه کنید.
سخن پایانی
میتوان نتیجه گرفت که SNI یک مکانیزم امن و کارآمد برای برقراری ارتباط با وبسایتهایی است که از یک آدرس IP مشترک استفاده میکنند. امروزه SNI به طور گسترده در سراسر جهان استفاده میشود و به عنوان یک بخش ضروری از پروتکل TLS برای برقراری ارتباط امن با وبسایتها شناخته میشود. علاوه بر همه این موارد SNI به توسعه و استفاده از فناوریهای جدید مانند HTTP/2 کمک میکند.
هر کدام از فناوریهایی که برای سرورها بکار گرفته میشوند، بر اساس نیاز در زمان ابداع یک روش جدید بوجود آمدهاند. SNI ، SSL ، VPS هر کدام وظیفهای را به عهده دارند. درک عملکرد این فناوریها به وبمستر و صاحبین وبسایتها کمک میکند تا چگونگی عملکرد وبسایت خود در سرور را درک کنند و بتوانند آگاهانه روند توسعه آن را پیش ببرند. ممکن است دانستن عملکرد SNI و دیگر فناوریهای سمت سرور، برای ادمینهای وبسایت زیاد کاربردی نباشد، اما آگاهی از عملکرد آنها میتواند قدرت توسعه شما را بالا ببرد و در نتیجه وبسایتهای با کیفیت تری را طراحی کنید.