TLS یا (امنیت لایه انتقال) و نسخه قبلی آن SSL (لایه سوکتهای امن)، بهعنوان پروتکلهای وب شناخته میشوند که هر نوع ترافیک اینترنتی را رمزنگاری و محافظت میکنند. سرورها با استفاده از این تکنولوژی میتوانند ارتباط امنی را بین خود و کاربران برقرار کنند و از امکان خواندن و رهگیری دادهها و پیامها توسط گیرندههای دیگر جلوگیری کنند. همچنین این سیستم گواهی به کاربران برای تأیید احراز هویت سایتهایی که با آنها در ارتباط هستند، کمک میکند. در این مقاله از سری مقالات آموزش نصب ssl به بررسی و آموزش نصب Self-Signed SSL Certificate در Nginx in Ubuntu 16.04 خواهیم داد.
گواهیهای خود امضا شده (Self-Signed) ارتباط بین سرور و کاربران را رمزگذاری میکنند؛ اما از آنجایی که توسط مرورگرهای وب امضا نشدهاند، کاربران نمیتوانند از این گواهی برای اعتبارسنجی خودکار سرور استفاده کنند. این نوع گواهی برای کاربردهای شخصی و زمانی که نام دامنه با سرور مرتبط نیست، مناسب است. در صورتی که دامنه دارید، بهتر است از گواهینامههای امضا شده توسط سازمان صدور گواهینامه (CA) استفاده کنید.
پیش نیاز نصب
قبل از شروع، باید از کاربر غیر اصلی (non-root) با دسترسی sudo استفاده کنید. همچنین باید سرور Nginx را نصب کنید.
مراحل نصب Self-Signed SSL Certificate در Nginx in Ubuntu 16.04
مرحله 1: گواهی SSL را ایجاد کنید
TLS/SSL با استفاده از ترکیبی از گواهی عمومی و کلید خصوصی کار میکند. کلید SSL روی سرور مخفی است و برای رمزگذاری محتوای ارسال شده به کاربران استفاده میشود. گواهی SSL بهصورت عمومی برای هر کسی که محتوا را درخواست میکند، به اشتراک گذاشته میشود. همچنین میتوان از کلید SSL جهت رمزگشایی محتوای امضا شده، استفاده کرد.
شما میتوانید طبق دستور زیر یک جفت گواهی و کلید خود امضا شده را با استفاده از OpenSSL ایجاد کنید:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
پس از اجرای این دستور از شما سؤالاتی پرسیده میشود. قبل از اینکه به این سؤالات بپردازیم، اجزای این دستور را توضیح خواهیم داد.
Openssl: ابزار اصلی دستور است و برای ایجاد و مدیریت گواهیهای OpenSSL، کلیدها و سایر فایلها استفاده میشود.
Req: این دستور فرعی مشخص میکند که میخواهیم از مدیریت درخواست امضای گواهی X.509 استفاده کنیم. X.509 یک زیرساخت استاندارد کلید عمومی است که SSL و TLS برای مدیریت گواهیها و کلیدهای خود از آن استفاده میکنند. چون میخواهیم یک گواهی X.509 جدید ایجاد کنیم؛ بنابراین از این زیر دستور استفاده میکنیم.
x509-: این پارامتر، زیر دستور قبلی را اصلاح میکند. بدینصورت که بهجای ایجاد یک درخواست امضای گواهی که روال معمول است، یک گواهی خود امضا (Self-Signed) ایجاد میکند.
nodes-: این پارامتر تعیین میکند که OpenSSL باید از گزینه ایمنسازی گواهی با عبارت عبور (passphrase) صرفنظر کند. برای این کار به Nginx نیاز داریم تا بتوانیم این فایل را در هنگام راهاندازی سرور و بدون دخالت کاربر بخوانیم. عبارت عبور از این مرحله جلوگیری میکند؛ بدینصورت که باید بعد از هر بار راهاندازی مجدد سرور، آن را وارد کنیم.
days 365-: این گزینه مدت زمان اعتبار گواهی معتبر را تعیین میکند. در اینجا آن را برای یک سال تعیین میکنیم.
newkeys rsa:2048- : این گزینه تعیین میکند که میخواهیم بهصورت همزمان یک گواهی و کلید جدید را ایجاد کنیم. در مرحله قبلی کلید موردنیاز برای امضای گواهی را ایجاد نکردیم؛ بنابراین باید آن را همراه با گواهی ایجاد کنیم. بخش rsa:2048 به این معنی است که کلید RSA باید طولی بهاندازه 2048 بیت بسازد.
keyout- : این پارامتر به OpenSSL میگوید که فایل کلید خصوصی ایجاد شده را در کجا ذخیره کند.
out- : این پارامتر تعیین میکند که OpenSSL، گواهیهای ساخته شده را در کجا ذخیره کند.
همانطور که در بالا بیان کردیم، این گزینهها همزمان یک فایل کلید و یک گواهی ایجاد میکنند. سپس از شما چند سؤال در مورد سرور پرسیده میشود تا اطلاعات بهدرستی در گواهی ثبت شوند؛ بنابراین باید به سؤالات دقیق پاسخ دهید. مهمترین سؤال مربوط به Common Name یا همان نام سرور است. شما باید نام دامنه مرتبط با سرور خود یا IP عمومی سرور خود را وارد کنید.
کل دستورات شبیه دستور زیر خواهد بود:
Output
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
Organizational Unit Name (eg, section) []:Ministry of Water Slides
Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
Email Address []:admin@your_domain.com
هر دو فایلی که ایجاد کردید، در پوشه etc/ssl/ ذخیره میشوند.
تا زمانی که از OpenSSL استفاده میکنید، باید یک گروه قوی Diffie-Hellman را نیز ایجاد کنید که در هنگام ارتباط با مشتریان بهصورت Perfect Forward Secrecy استفاده میشود. شما میتوانید این کار با اجرای دستور زیر انجام دهید:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
این کار ممکن است چند دقیقه طول بکشد؛ اما زمانی که انجام شد، یک گروه قوی DH در مسیر etc/nginx/dhparam.pem/ خواهید داشت که میتوانید از آن در پیکربندیهای خود استفاده کنید.
مرحله 2: Nginx را برای استفاده از SSL پیکربندی کنید
اکنون فایلهای کلید و گواهی را در پوشه/etc/ssl ایجاد کردهاید. حال باید پیکربندی Nginx را تغییر دهید تا از مزایای آن استفاده کنید. طبق دستورات زیر تنظیمات پیکربندی را تغییر دهید:
- یک اسنیپت (snippet ) پیکربندی شامل مکانهای فایلهای کلید و گواهی SSL ایجاد کنید.
- یک اسنیپت پیکربندی حاوی تنظیمات SSL قوی ایجاد کنید که میتواند در آینده برای هر گواهی استفاده شود.
- بلوکهای سرور Nginx را برای مدیریت درخواستهای SSL و استفاده از دو اسنیپت بالا تنظیم کنید.
این روش پیکربندی Nginx به شما این امکان را میدهد تا بلوکهای سرور را مرتب و تمیز نگه دارید و بخشهای پیکربندی رایج را در ماژولهایی با قابلیت استفاده مجدد، قرار دهید.
ایجاد اسنیپت پیکربندی جهت اشاره به کلید و گواهی SSL
ابتدا، یک اسنیپت پیکربندی Nginx جدید در پوشه /etc/nginx/snippets ایجاد کنید. برای تشخیص درست، فایل را با نام self-signed.conf ذخیره کنید.
sudo nano /etc/nginx/snippets/self-signed.conf
در این فایل، باید مسیر ssl_certificate را به فایل گواهی و مسیر ssl_certificate_key را به کلید مرتبط تنظیم کنید. در این حالت به شکل زیر خواهد بود:
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
زمانی که این مسیرها را اضافه کردید، فایل را ذخیره کرده و ببندید.
ایجاد اسنیپت پیکربندی با تنظیمات رمزنگاری قوی
در مرحله بعد، یک اسنیپت ایجاد کنید که برخی از تنظیمات SSL را تعیین میکند. این اسنیپت، Nginx را با یک مجموعه رمزنگاری قوی SSL تنظیم میکند و برخی از ویژگیهای پیشرفته را فعال میکند که به حفظ امنیت سرور کمک میکند. پارامترهایی که در این فایل تعریف میشوند، میتوانند در پیکربندیهای بعدی Nginx نیز مورد استفاده قرار گیرند؛ بنابراین نام فایل را بهصورت کلی تعیین میکنیم:
sudo nano /etc/nginx/snippets/ssl-params.conf
شما میتوانید برای راهاندازی ایمن Nginx SSL، از توصیههای Remy van Elst در سایت Cipherli.st استفاده کنید. این سایت بهمنظور ارائه تنظیمات رمزگذاری آسان برای نرمافزارهای محبوب طراحی شده است.
تنظیمات پیشنهادی وبسایت فوق امنیت بالایی را ایجاد میکند. گاهی اوقات این تنظیمات به قیمت سازگاری بیشتر با کاربر تمام میشود. اگر میخواهید از کاربران قدیمی نیز پشتیبانی کنید، میتوانید از لیست جایگزینی که در لینک «Yes, give me a ciphersuite that works with legacy / old software» قرار دارد، استفاده کنید. انتخاب پیکربندی تا حد زیادی به مواردی که باید پشتیبانی کنید، بستگی دارد؛ اما بهصورت کلی هر دو تنظیمات، امنیت بالایی ایجاد خواهند کرد.
شما میتوانید تنظیمات ارائه شده را بهطور کامل و تنها با چند تغییر جزئی کپی کنید. ابتدا DNS resolver ترجیحی خود را برای درخواستهای بالا بهصورت دستی تعیین کنید (از گوگل کمک بگیرید) و تنظیمات ssl_dhparam را طوری تنظیم کنید که به فایل Diffie-Hellman که قبلاً ایجاد کردهاید، اشاره کند. مراقب HSTS باشید؛ زیرا اگر بهطور تصادفی فعال یا نادرست فعال شود، میتواند عواقب بسیار گستردهای داشته باشد. دستور زیر را در فایل اسنیپت ssl-params.conf کپی کنید:
# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers “EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH”;
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable preloading HSTS for now. You can use the commented out header line that includes
# the “preload” directive if you understand the implications.
#add_header Strict-Transport-Security “max-age=63072000; includeSubdomains; preload”;
add_header Strict-Transport-Security “max-age=63072000; includeSubdomains”;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
به دلیل اینکه از یک گواهی خود امضا استفاده میکنید، از SSL stapling استفاده نخواهد شد. بدین منظور Nginx هشدار میدهد و stapling را برای گواهی امضا شده، غیرفعال میکند و بهدرستی به کار خود ادامه میدهد. پس از اتمام کار فایل را ذخیره کرده و ببندید.
تنظیم پیکربندی Nginx برای استفاده از SSL
اکنون که اسنیپتها را دارید، میتوانید پیکربندی Nginx خود را برای فعال کردن SSL تنظیم کنید. در این مقاله فرض میکنیم که شما از فایل بلوک سرور پیشفرض در پوشه /etc/nginx/sites-available استفاده میکنید. اگر از فایل بلوک سرور دیگری استفاده میکنید، نام آن را در دستورات زیر جایگزین کنید. همچنین قبل از اینکه به مرحله بعدی بروید، از فایل بلوک سرور فعلی خود نسخه پشتیبان تهیه کنید.
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
اکنون فایل بلوک سرور را برای انجام تنظیمات باز کنید:
sudo nano /etc/nginx/sites-available/default
در این فایل، احتمالاً بلوک سرور شما به این صورت شروع میشود:
server {
listen 80 default_server;
listen [::]:80 default_server;
# SSL configuration
# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;
. . .
با این تغییرات، درخواستهای HTTP رمزگذاری نشده بهطور خودکار به HTTPS رمزگذاری شده تبدیل میشوند. این تغییر بالاترین امنیت را برای سایت فراهم میکند. اگر میخواهید ترافیک HTTP و HTTPS را مجاز کنید، از پیکربندی جایگزین زیر استفاده کنید.
برای این کار پیکربندی را به دو بلوک جداگانه تقسیم کنید. بدینصورت که بعد از دو دستور listen ، دستور server_name را با نام دامنه سرور یا IP اضافه کنید. سپس یک تغییر مسیر به دومین بلوک سروری ایجاد کنید و سپس بلوک کوتاه را ببندید.
نکته: تا زمانی که مطمئن میشوید همهچیز بهدرستی کار میکند، از ریدایرکت 302 و پس از آن میتوانید از ریدایرکت دائمی 301 استفاده کنید.
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name server_domain_or_IP;
return 302 https://$server_name$request_uri;
}
# SSL configuration
# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;
. . .
در مرحله بعد، یک بلوک سرور جدید زیر پیکربندی قبلی ایجاد کنید. شما میتوانید دستور listen که از پورت 443 استفاده میکند را لغو کنید. همچنین میتوانید http2 را به این دستور اضافه کنید تا HTTP/2 در این بلوک فعال شود. پس از آن، باید دو فایل اسنیپتی که تنظیم کردهاید را اضافه کنید:
نکته: شما ممکن است فقط یک دستور listen با تنظیمات default_server برای هر IP و پورت داشته باشید. اگر بلوکهای سرور دیگری که دارای تنظیمات پیشفرض default_server هستند را برای این پورتها فعال کردهاید، باید modifier را از یکی از بلوکها حذف کنید.
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name server_domain_or_IP;
return 302 https://$server_name$request_uri;
}
server {
# SSL configuration
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
include snippets/self-signed.conf;
include snippets/ssl-params.conf;
. . .
پس از اتمام کار فایل را ذخیره کرده و ببندید.
پیکربندی جایگزین برای مجاز کردن ترافیک HTTP و HTTPS
اگر قصد دارید که محتوای رمزگذاری شده و غیر رمزگذاری شده را مجاز کنید، باید پیکربندی Nginx را تا حدودی تغییر دهید. بدینصورت که دو بلوک سرور جداگانه را در یک بلوک فشرده کنید و تغییر مسیر را حذف کنید.
/etc/nginx/sites-available/default
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name server_domain_or_IP;
include snippets/self-signed.conf;
include snippets/ssl-params.conf;
. . .
در نهایت فایل را ذخیره کرده و ببندید.
مرحله 3: فایروال را تنظیم کنید
اگر فایروال ufw را فعال کردهاید، باید تنظیمات آن را برای فعالسازی ترافیک SSL تغییر دهید. خوشبختانه Nginx بعد از نصب، چند پروفایل با ufw ثبت میکند. در دستور زیر پروفایلهای موجود را مشاهده کنید:
sudo ufw app list
شما باید چنین لیستی را ببینید:
Output
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
تنظیمات فعلی بهصورت زیر است:
sudo ufw status
خروجی دستور فوق نشان میدهد که فقط ترافیک HTTP به این وب سرور مجاز است:
Output
Status: active
To Action From
— —— —-
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)
برای اینکه ترافیک HTTPS فعال شود، باید از پروفایل «Nginx Full» استفاده کنید و سپس مجوز پروفایل «Nginx HTTP» را حذف کنید:
sudo ufw allow ‘Nginx Full’
sudo ufw delete allow ‘Nginx HTTP’
نتیجه بدین شکل خواهد بود:
sudo ufw status
خروجی دستور:
Output
Status: active
To Action From
— —— —-
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)
مرحله 4: تغییرات را در Nginx فعال کنید
اکنون که تغییرات لازم را انجام دادهاید و فایروال خود را تنظیم کردهاید، میتوانید Nginx را مجدداً راهاندازی کنید تا تغییرات جدید اعمال شوند. ابتدا بررسی کنید که هیچگونه خطایی در فایلها وجود نداشته باشد. این کار را با دستور زیر انجام دهید:
sudo nginx –t
اگر همه چیز موفقیتآمیز باشد، خروجی به شکل زیر خواهد بود:
Output
nginx: [warn] “ssl_stapling” ignored, issuer certificate not found
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
به هشدار ابتدایی توجه کنید. همانطور که قبلاً گفتیم، این تنظیم خاص یک هشدار میدهد؛ زیرا گواهی خود امضا شده (Self-Signed) نمیتواند از SSL Stapling استفاده کند. این شرایط قابل انتظار و طبیعی است و همچنان سرور میتواند اتصالات را بهدرستی رمزگذاری کند. اگر خروجی شما مطابق کد بالایی باشد، فایل پیکربندی شما هیچ خطایی ندارد و میتوانید با خیال راحت Nginx را مجدداً ریاستارت کنید تا تغییرات اعمال شوند:
sudo systemctl restart nginx
مرحله 5: تست رمزگذاری
اکنون، سرور SSL آماده آزمایش است. مرورگر وب خود را باز کنید و https:// و سپس نام دامنه یا IP سرور خود را در نوار آدرس تایپ کنید:
از آنجایی که گواهی که ایجاد کردهاید، توسط هیچکدام از مرورگرهای وب امضا نشده است، احتمالاً یک هشدار ترسناک مشاهده خواهید کرد. این هشدار طبیعی است؛ زیرا برای ما فقط جنبه رمزنگاری گواهی مهم است و به تأیید احراز هویت هاست نیازی نیست. بر روی گزینه «ADVANCED» کلیک کنید و سپس روی لینک ارائه شده کلیک کنید تا به سرور خود وصل شوید.
اکنون شما باید به سایت خود وارد شوید. اگر به نوار آدرس مرورگر نگاه کنید، یک آیکون قفل با علامت “x” روی آن خواهید دید. این علامت به این معنی است که این گواهی نمیتواند معتبر باشد؛ اما اتصال شما همچنان رمزنگاری شده است.
اگر Nginx را با دو بلوک سرور پیکربندی کردهاید، بهطور خودکار محتوای HTTP به HTTPS ریدایرکت میشود. همچنین میتوانید بررسی کنید که ریدایرکت بهدرستی عمل میکند یا خیر:
http://server_domain_or_IP
اگر همان آیکون نمایان شد، به این معنی است که ریدایرکت شما بهدرستی کار کرده است.
مرحله 6: ریدایرکت دائمی را تغییر دهید
اگر ریدایرکت شما بهدرستی عمل میکند و مطمئن هستید که میخواهید فقط ترافیک رمزگذاری شده را مجاز کنید، باید پیکربندی Nginx را تغییر دهید تا ریدایرکت دائمی شود. برای این کار فایل پیکربندی بلوک سرور خود را دوباره باز کنید:
sudo nano /etc/nginx/sites-available/default
عبارت return 302 را پیدا کنید و آن را به return 301 تغییر دهید:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name server_domain_or_IP;
return 301 https://$server_name$request_uri;
}
. . .
تغییرات را ذخیره کنید و فایل را ببندید. سپس پیکربندی را برای خطاهای ساختاری بررسی کنید:
sudo nginx –t
اکنون میتوانید Nginx را مجدداً ریاستارت کنید تا ریدایرکت دائمی شود:
sudo systemctl restart nginx
جمعبندی
در این مقاله شما با آموزش نصب Self-Signed SSL Certificate در Nginx in Ubuntu 16.04 بهمنظور استفاده از رمزنگاری قوی برای اتصال کاربران آشنا شدید. این آموزش به شما کمک میکند تا درخواستهای کاربران ایمن شود و از خواندن ترافیک بهوسیله افراد دیگر جلوگیری میشود.
سؤالات متداول
1. چگونه یک گواهی خود امضا شده را در Nginx in Ubuntu ایجاد کنیم؟
شما میتوانید یک جفت کلید و گواهی خود امضا شده با OpenSSL در یک دستور ایجاد کنید:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned. key -out /etc/ssl/certs/nginx-selfsigned. crt.
2. چگونه در Ubuntu گواهی خود امضا شده ایجاد کنیم؟
- پکیج repository را در Ubuntu بهروزرسانی کنید.
- صفحه پیشفرض Apache را بررسی کنید.
- یک CSR و یک کلید خصوصی ایجاد کنید.
- فایل پیکربندی سایت پیشفرض SSL Apache را بهروزرسانی کنید.
- ماژولها و سایتهای وب سرور Apache و سرویس Apache را مجدداً راهاندازی کنید.
3. چگونه ssl را در nginx Ubuntu فعال کنیم؟
نحوه نصب یک گواهینامه رایگان SSL در وب سرور NGINX بدینصورت است:
مرحله 1 – از طریق SSH به سرور خود وارد شوید.
مرحله 2 – هاست مجازی ایجاد کنید.
مرحله 3 – فایل پیکربندی NGINX را پیکربندی کنید.
مرحله 4 – فایل پیکربندی پیشفرض NGINX را Unlink کنید.
مرحله 5 – فایل پیکربندی جدید را لینک دهید.
مرحله 6 – خطای پیکربندی را آزمایش کنید.