دوشنبه, ۱۳ اسفند, ۱۴۰۳ / 3 March, 2025
امن کردن وب سایت با استفاده از SSL TLS در nginx

خدمترسانی از طریق HTTPS به این معنی نیست که ترافیک دادهها رمزگذاری شده است، رمزگذاری تنها نیمی از ماجراست و بدون احراز هویت بیفایده خواهد بود. اگر رمزگذاری بین دوطرف انجام شود اما ندانیم طرف دیگر چه کسی است، چه اهمیتی دارد؟ بنابراین برای استفاده از ترافیک HTTPS باید مدرکی رمزبندیشده داشته باشیم تا هویتمان را نشان دهد. دریافت چنین مدرکی مستلزم این است که هویت وبسایت توسط یکی از Certificate Authorityها تائید شود.
ظاهر امر، ترسناکتر از کاری است که باید انجام دهیم. بیشتر CAهای مشهور برای احراز هویت و اهدای گواهی هزاران دلار پول درخواست میکنند. اگر کار وبسایت شامل e-commerce هم میشود، شاید منطقی باشد که برای دریافت آن گواهی اقدام کرد، اما اگر سایت کوچکی است یا واقعا هزاران دلار پول نداریم، چنین خرجی نه منطقی است و نه لازم.
● SSL/TLS بهطور خلاصه
SSL مخفف عبارت Secure Sockets Layer است. هر چند خود SSL امروزه کمتر استفاده میشود و بهجای آن روش پیچیدهتر و امنتری به نام Transport Layer Security مورد استفاده قرار میگیرد. عبارت SSL بیشتر به این دلیل استفاده میشود که شناخته شده است و در طول این مقاله، از این مبحث با نام SSL/TLS یاد خواهیم کرد.
SSL/TLS ترکیبی از فناوریهای مختلف است اما روش کارکرد آن، مشابه همان مفهوم کلیدهای رمزگذاری عمومی و خصوصی است. یک سرور وب، یک جفت کلید عمومی و خصوصی تولید میکند. وقتی کلاینت میخواهد یک Session از نوع HTTPS ایجاد کند، گواهی سرور را درخواست میکند. این اقدام از طریق یکی از مقامات تحت وب مدارک انجام میشود تا آدرس درخواستی معتبر شود و نشان دهد گواهی دارنده وبسایت منقضی یا باطل نشده باشد. (در این زمان است که بیشتر هشدارهای مرورگرها نشان داده میشود؛ چرا که مرورگر در این مرحله است که تصمیم میگیرد مدرک گواهی وبسایت را قبول کند یا نه.)
کلاینت سپس آیتم رمزگذاریشدهای را با عنوان pre-master secret انتخاب و آن را با کلید عمومی سرور رمزگذاری میکند و به سمت سرور میفرستد. بهدلیل طبیعت رمزگذاری کلیدهای عمومی، چیزی که با کلید عمومی رمزگذاری شده باشد، تنها از طریق کلیدهای خصوصی مرتبط با آن میتواند خوانده شود. اگر سرور بتواند pre-master secret را رمزگشایی کند، در نتیجه کلید خصوصی فعلی در اختیار سرور است و ارتباط برقرار میشود.
رمزگشایی غیرهمزمان (Asymmetric) کند است و سرور و کلاینت خیلی از آن استفاده نخواهد کرد. در حقیقت آنها از سری مراحلی پیروی کرده که pre-master secret را بهmaster secret تبدیل میکند و در نتیجه یک کلید Session تولید میشود. این کلیدی همزمان است که برای رمزگذاری و رمزگشایی در دو طرف ارتباط استفاده میشود.
● آیا به مدرکی واقعی نیاز داریم؟
برای خدمترسانی از طریق HTTPS به یک مدرک تولیدشده از سوی CAها نیازی نداریم. هرچند داشتن یک مدرک واقعی (بهجای آن که خودمان تولید کردهایم) میتواند هشداری را که کاربران هنگام باز کردن صفحه میبینند، حذف کند. (هشداری که ممکن است کاربران را فراری بدهد.)
استفاده از مدارک خودامضا و خودتولید برای تست و استفاده در سایتهای داخلی کار صحیحی است، اما استفاده از همین مدارک در فضای اینترنت نهتنها مفید نیست بلکه یکی از دو مولفه اصلی استفاده از HTTPS را زیر سوال میبرد. مدرکی که توسط یک CA شناخته شده امضا شود بهاین معنی است که شما (وبسایت) همان کسی هستید که خود را معرفی میکنید. حتی مهمتر از آن، وبسایتهای اینچنینی بیشتر در معرض خطر تهدید قرار خواهد گرفت؛ زیرا کاربران بسادگی آنها را رد خواهد کرد. بنابراین، بله، به مدرک واقعی نیاز داریم.
● انواع مدارک
CAهای مختلف، مدارک مختلفی عرضه میکنند و معمولا برای کلاسهای بالاتر، هزینههای بیشتری دارند. اما تقریبا در همه موارد، میزان رمزبندی این مدرک برابر است و میزان کارهایی که برای معتبرسازی صفحه انجام میشود، متفاوت خواهد بود.
وقتی به سایتهای مختلف CA سر بزنیم، متوجه خواهیم شد رفرنسهایی به کلاس ۱/۲ یا ۳ داده میشود. همچنین مدارکی با عنوانهای wildcard یا extended نیز وجود دارد. هر چند از نظر قدرت کلید رمزبندی، کلاس۱ از کلاس۲ امنتر نیست، اما کلاس۲ بهدلیل مرحله معتبرسازی هویت، کمی مطمئنتر است. بسته به عرضه کننده SSL، کلاسهای مختلف زیادی وجود خواهد داشت.
مدرک extended validation یا EV به یک استاندارد تبدیل شده است و در مرورگرهای مدرن، به شیوه بهتری نشان داده میشود و به رنگ سبز خواهد بود.
مدارک EV را معمولا خود CAها در وبسایتهایشان استفاده میکنند. وبسایتهایی که مستقیما برای خرید و فروش استفاده میشود نیز معمولا از EV استفاده میکنند. این نوع مدارک از بقیه گرانتر بوده و دریافت آنها نیز بسیار دشوار است؛ زیرا کارهای زیادی برای احراز هویت وبسایت انجام میشود.
اما وبسایتهای معمولی نیازی به EV ندارند. حتی افزونههایی که اغلب CAها تبلیغ میکنند نیز الزامی نیست.به مدارک wildcart (نوع خاصی از SSL/TLS که برای سرورهای مختلف در یک دومین استفاده میشود) نیز نیازی نیست. در حقیقت برای یک وبسایت شخصی بجز یک مدرک ساده SSL/TLS به چیز دیگری نیاز نداریم.
برای دریافت یک مدرک SSL/TLS، به یک چیز نیاز داریم. سرور وب باید نام داشته باشد. نام سرور چیزی است که بهعنوان بخشی از هویت آن شناسایی خواهد شد. اگر دامنه.com یا.org را ثبت نکردهاید، باید ابتدا این کار را انجام دهیم.
سریعترین کار برای ثبت آن، استفاده از گوگل است. گوگل با هزینه هشت دلار میتواند اینترفیسی شبیه گوگل دراختیار کاربر قرار دهد و تا ده کاربر نیز میتواند از آن استفاده کند.
برای دریافت SSL بعد از انجام کارهای فوق، به نشانی زیر بروید تا اطلاعات بیشتری از شیوه و چگونگی به دست آوردن مدرک SSL کسب کنید:
http://arstechnica.com/security/۲۰۰۹/۱۲/how-to-get-set-with-a-secure-sertificate-for-free/
بعد از این که کلید را به دست آوردید، با اجرای دستورهای زیر در سرور میتوانیم کلیدها را به سرور وصل کنیم.
scp ssl.key yourname@webserver:~
scp ssl.crt yourname@webserver:~
در دستور بالا، فایل کلید با نام ssl.key و فایل مدرک با نام ssl.crt مشخص شده است. شناسه کاربری و نام سرور را در بخش webserver و username قرار دهید.
بعد از این که کلید و مدرک کپی شد، باید کلید را رمزگشایی کنیم. برای این کار، دستور زیر را اجرا کنید:
sudo openssl rsa -in ssl.key -out /etc/nginx/conf/ssl.key
نخستین بار که این دستور اجرا میشود، شناسه و رمز عبورتان درخواست میشود. openssl یک کپی رمزگشایی شده از کلید خصوصیرا در مسیر /etc/nginx/conf قرار میدهد. (بههمین دلیل از sudo استفاده شد، چرا که کاربر با دسترسی عادی نمیتواند فایل در آن محل قرار دهد)
حفظ این کلید بسیار مهم است، چرا که پایه هویت سرور را تشکیل میدهد و هر کسی به آن دست پیدا کند میتواند از نظر رمزگذاری، هویت سرور را از آن خود کند. بنابراین بهتر است به Nginx و پروسسهای آن دست پیدا کنند.
sudo chown www-data:www-data /etc/nginx/conf/ssl.key
sudo chmod ۶۰۰ /etc/nginx/conf/ssl.key
دستور اول، فایل را در اختیار www-data قرار میدهد. دستور دوم سطوح دسترسی آن را طوری تعیین میکند که تنها صاحب آن بتواند آن را خوانده یا در آن بنویسد.
بعد باید باید مدارک intermediate و root را ازCA دریافت کرده و آنها را با مدرک سرور یکی کنیم و در یک زنجیر بزرگتر قرار دهیم. این موضوع علاوه بر اینکه درک هویت از سوی مرورگر را راحتتر میکند، سادهترین روش ممکن در پیادهسازی گواهی SSL در Nginx هم هست.
cd /etc/nginx/conf
sudo wget http://www.startssl.com/certs/ca.pem
sudo wget http://www.startssl.com/certs/sub.class۱.server.ca.pem
سه دستور بالا، مستقیما ما را به مقصد میرساند. با کمک دستور زیر، هر سه فایل را به یک فایل تبدیل میکنیم.
sudo cat ~/ssl.crt sub.class۱.server.ca.pem ca.pem » /etc/nginx/conf/ssl-unified.crt
فایلهای گواهی بهصورت متنی است و بسادگی با دستور cat آنها را یکی میکنیم.
● اتصال به nginx
حالا که فایلهای کلید را باز کرده و مدرکمان آماده است، باید به nginx بگوییم چطور از آنها استفاده کند. دو فایل را برای انجام این کار باید ویرایش کنیم. نخست فایل اصلی nginx.conf و بعد فایل Vitrual Host. اگر چند وبسایت و فایل Virtual Host دارید، باید یکی یکی آنها را ویرایش کنید. فرض میگیریم تنها یک Virtual Host دارید.
فایل nginx.conf را باز کرده و دستور زیر را در انتهای آن وارد کنید:
ssl_session_cache shared:SSL:۱۰m;
بعد فایل virtual host خود را باز کنید. در این فایل تنها یک میزبان غیر SSL وجود دارد که در پورت ۸۰ قرار گرفته است. میخواهیم میزبان جدیدی در این فایل ایجاد کنیم که در پورت ۴۴۳ گوش میکند. بخش زیر را زیر سرور فعلی قرار دهید:
server {
listen ۴۴۳ ssl;
root /usr/share/nginx/html;
index index.html index.htm;
server_name your-server-name;
ssl on;
ssl_certificate /etc/nginx/conf/ssl-unified.crt;
ssl_certificate_key /etc/nginx/conf/ssl.key;
ssl_protocols SSLv۳ TLSv۱ TLSv۱.۱ TLSv۱.۲;
ssl_ciphers ECDHE-RSA-AES۲۵۶-SHA۳۸۴:AES۲۵۶-SHA۲۵۶:RC۴: HIGH:!MD۵:!aNULL:!EDH:!AESGCM;
ssl_prefer_server_ciphers on;
ssl_ecdh_curve secp۵۲۱r۱;
}
محمدرضا قربانی
ایران مسعود پزشکیان دولت چهاردهم پزشکیان مجلس شورای اسلامی محمدرضا عارف دولت مجلس کابینه دولت چهاردهم اسماعیل هنیه کابینه پزشکیان محمدجواد ظریف
پیاده روی اربعین تهران عراق پلیس تصادف هواشناسی شهرداری تهران سرقت بازنشستگان قتل آموزش و پرورش دستگیری
ایران خودرو خودرو وام قیمت طلا قیمت دلار قیمت خودرو بانک مرکزی برق بازار خودرو بورس بازار سرمایه قیمت سکه
میراث فرهنگی میدان آزادی سینما رهبر انقلاب بیتا فرهی وزارت فرهنگ و ارشاد اسلامی سینمای ایران تلویزیون کتاب تئاتر موسیقی
وزارت علوم تحقیقات و فناوری آزمون
رژیم صهیونیستی غزه روسیه حماس آمریکا فلسطین جنگ غزه اوکراین حزب الله لبنان دونالد ترامپ طوفان الاقصی ترکیه
پرسپولیس فوتبال ذوب آهن لیگ برتر استقلال لیگ برتر ایران المپیک المپیک 2024 پاریس رئال مادرید لیگ برتر فوتبال ایران مهدی تاج باشگاه پرسپولیس
هوش مصنوعی فناوری سامسونگ ایلان ماسک گوگل تلگرام گوشی ستار هاشمی مریخ روزنامه
فشار خون آلزایمر رژیم غذایی مغز دیابت چاقی افسردگی سلامت پوست