مقدمه
TLS یا امنیت لایه انتقال و SSL قبلی آن که مخفف لایه سوکت های امن است، پروتکل های وب هستند که برای محافظت و رمزگذاری ترافیک روی یک شبکه کامپیوتری استفاده می شوند.
با TLS/SSL، سرورها می توانند ترافیک را بین سرور و کلاینت ها بدون امکان رهگیری پیام ها توسط طرف های خارجی به طور ایمن ارسال کنند. سیستم گواهی همچنین به کاربران در تأیید هویت سایت هایی که با آنها در ارتباط هستند کمک می کند.
در این راهنما، شما یک گواهی SSL خود امضا شده را برای استفاده با یک وب سرور Nginx در سرور اوبونتو تنظیم خواهید کرد.
پیش نیازها
- قبل از شروع، باید یک کاربر غیر ریشه پیکربندی شده با امتیازات sudo و فایروال فعال داشته باشید.
- همچنین باید وب سرور Nginx را نصب کنید.
- اگر می خواهید یک پشته کامل LEMP (Linux، Nginx، MySQL، PHP) را روی سرور خود نصب کنید.
مرحله 1 – ایجاد گواهی TLS
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
در اینجا خلاصه ای از آنچه هر قسمت از این دستور انجام می دهد آورده شده است:
sudo
: دستور sudo به اعضای گروه sudo اجازه می دهد تا به طور موقت امتیازات خود را به یک کاربر دیگر (به طور پیش فرض ابرکاربر یا کاربر ریشه) ارتقا دهند. این در این مورد ضروری است زیرا ما در حال ایجاد گواهی و جفت کلید در دایرکتوری /etc/ هستیم که فقط توسط کاربر اصلی یا سایر حساب های دارای امتیاز قابل دسترسی است.openssl
: این ابزار اصلی خط فرمان برای ایجاد و مدیریت گواهینامهها، کلیدها و سایر فایلهای OpenSSL است.req
: این دستور فرعی مشخص می کند که می خواهیم از مدیریت X.509 گواهی امضای درخواست (CSR) استفاده کنیم. “X.509” یک استاندارد زیرساخت کلید عمومی است که SSL و TLS برای مدیریت کلید و گواهی خود به آن پایبند هستند. ما می خواهیم یک گواهی X.509 جدید ایجاد کنیم، بنابراین از این دستور فرعی استفاده می کنیم.- –
x509
: این فرمان فرعی قبلی را با گفتن اینکه ما میخواهیم به جای ایجاد درخواست امضای گواهی، همانطور که معمولاً اتفاق میافتد، یک گواهی خودامضا بسازیم، دستور فرعی قبلی را اصلاح میکند. - –
nodes
: این به OpenSSL می گوید که از گزینه ایمن سازی گواهی ما با یک عبارت عبور صرف نظر کند. ما به Nginx نیاز داریم تا بتوانیم فایل را بدون دخالت کاربر هنگام راه اندازی سرور بخوانیم. یک عبارت عبور از این اتفاق جلوگیری می کند زیرا ما باید بعد از هر راه اندازی مجدد آن را وارد کنیم. -days 365
: این گزینه مدت زمانی را تعیین می کند که گواهی معتبر در نظر گرفته شود. ما آن را برای یک سال در اینجا تنظیم کردیم.-newkey rsa:2048
: مشخص می کند که می خواهیم همزمان یک گواهی جدید و یک کلید جدید تولید کنیم. ما کلید مورد نیاز برای امضای گواهی را در مرحله قبل ایجاد نکردیم، بنابراین باید آن را همراه با گواهی ایجاد کنیم. بخش rsa:2048 به آن می گوید که یک کلید RSA با طول 2048 بیت بسازد.-keyout
: این خط به OpenSSL می گوید که فایل کلید خصوصی تولید شده را که در حال ایجاد آن هستیم، کجا قرار دهد.-out
: این به OpenSSL میگوید گواهیای را که میسازیم کجا قرار دهد.
همانطور که قبلا گفته شد، این گزینه ها هم یک فایل کلید و هم یک گواهی ایجاد می کنند. پس از اجرای این دستور، از شما چند سوال در مورد سرورتان پرسیده می شود تا اطلاعات را به درستی در گواهی جاسازی کنید.
دستورات را به درستی پر کنید. مهمترین خط خطی است که نام مشترک را درخواست می کند (به عنوان مثال سرور FQDN یا نام شما). شما باید نام دامنه مرتبط با سرور خود یا به احتمال زیاد آدرس 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 (DH) نیز ایجاد کنید، که در مذاکره با مشتریان بهطور کامل از محرمانگی جلو استفاده میشود.
می توانید این کار را با تایپ کردن انجام دهید:
sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096
این کار کمی طول میکشد، اما وقتی این کار انجام شد، یک گروه DH قوی در /etc/nginx/dhparam.pem خواهید داشت که در طول پیکربندی استفاده میشود.
مرحله 2 – پیکربندی Nginx برای استفاده از SSL
اکنون که فایل های کلید و گواهی شما در دایرکتوری /etc/ssl ایجاد شده اند، باید پیکربندی Nginx خود را تغییر دهید تا از آنها استفاده کنید.
ابتدا، یک قطعه پیکربندی با اطلاعات مربوط به مکانهای کلید 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;
وقتی آن خطوط را اضافه کردید، فایل را ذخیره کرده و از ویرایشگر خارج شوید. اگر از nano برای ویرایش فایل استفاده کرده اید، می توانید این کار را با فشار دادن CTRL + X، Y و سپس ENTER انجام دهید.
ایجاد یک قطعه پیکربندی با تنظیمات رمزگذاری قوی
در مرحله بعد، یک قطعه دیگر ایجاد می کنید که برخی از تنظیمات SSL را تعریف می کند. این Nginx را با یک مجموعه رمزنگاری قوی SSL تنظیم می کند و برخی از ویژگی های پیشرفته را فعال می کند که به حفظ امنیت سرور شما کمک می کند.
پارامترهایی که تنظیم میکنید میتوانند در پیکربندیهای آینده Nginx مورد استفاده مجدد قرار گیرند، بنابراین میتوانید به فایل یک نام عمومی بدهید:
sudo nano /etc/nginx/snippets/ssl-params.conf
برای راه اندازی ایمن Nginx SSL، توصیه های Cipherlist.eu را تطبیق می دهیم. Cipherlist.eu یک منبع مفید و قابل هضم برای درک تنظیمات رمزگذاری مورد استفاده برای نرم افزارهای محبوب است.
برای اهداف خود، تنظیمات ارائه شده را به طور کامل کپی کنید، اما ابتدا باید چند تغییر کوچک ایجاد کنید.
ابتدا، حلکننده DNS دلخواه خود را برای درخواستهای بالادستی اضافه کنید. ما از Google (8.8.8.8 و 8.8.4.4) برای این راهنما استفاده خواهیم کرد.
دوم، خطی را که هدر امنیتی حمل و نقل سخت تعیین می کند، نظر دهید. قبل از لغو نظر این خط، باید یک لحظه در مورد امنیت حمل و نقل سخت HTTP یا HSTS و به طور خاص در مورد عملکرد “پیش بارگذاری” مطالعه کنید. پیش بارگذاری HSTS امنیت بیشتری را فراهم می کند، اما در صورت فعال یا نادرست فعال کردن تصادفی می تواند عواقب منفی گسترده ای نیز داشته باشد.
موارد زیر را به فایل قطعه ssl-params.conf خود اضافه کنید:
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1;
ssl_session_timeout 10m;
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 strict transport security for now. You can uncomment the following
# line if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
از آنجایی که از گواهی خودامضا استفاده می کنید، منگنه SSL استفاده نخواهد شد. Nginx یک اخطار خروجی میدهد و منگنهسازی را برای گواهی امضاشده ما غیرفعال میکند، اما سپس به درستی به کار خود ادامه میدهد.
پس از اتمام کار، فایل را با فشار دادن CTRL + X و سپس Y و ENTER ذخیره کرده و ببندید.
تنظیم پیکربندی Nginx برای استفاده از SSL
اکنون که قطعههای خود را دارید، میتوانید پیکربندی Nginx را برای فعال کردن SSL تنظیم کنید.
در این راهنما فرض میکنیم که از فایل پیکربندی بلوک سرور سفارشی در دایرکتوری /etc/nginx/sites-available استفاده میکنید. این راهنما همچنین از قراردادهای آموزش پیش نیاز Nginx پیروی می کند و از /etc/nginx/sites-available/your_domain برای این مثال استفاده می کند. در صورت نیاز نام فایل پیکربندی خود را جایگزین کنید.
قبل از حرکت به جلو، از فایل پیکربندی فعلی خود نسخه پشتیبان تهیه کنید:
sudo cp /etc/nginx/sites-available/your_domain /etc/nginx/sites-available/your_domain.bak
اکنون فایل پیکربندی را برای انجام تنظیمات باز کنید:
sudo nano /etc/nginx/sites-available/your_domain
در داخل، بلوک سرور شما احتمالاً مشابه موارد زیر شروع می شود:
server {
listen 80;
listen [::]:80;
root /var/www/your_domain/html;
index index.html index.htm index.nginx-debian.html;
server_name your_domain www.your_domain;
location / {
try_files $uri $uri/ =404;
}
}
ممکن است فایل شما به ترتیب متفاوتی باشد و به جای دستورات ریشه و فهرست، ممکن است تعدادی مکان، proxy_pass یا سایر دستورات پیکربندی سفارشی داشته باشید. این خوب است زیرا شما فقط باید دستورالعمل های گوش دادن را به روز کنید و قطعه های SSL را اضافه کنید. سپس این بلوک سرور موجود را تغییر دهید تا ترافیک SSL در پورت 443 ارائه شود و یک بلوک سرور جدید برای پاسخگویی در پورت 80 ایجاد کنید و به طور خودکار ترافیک را به پورت 443 هدایت کنید.
در فایل پیکربندی موجود، دو عبارت listen را برای استفاده از پورت 443 و ssl بهروزرسانی کنید، سپس دو فایل قطعهای را که در مراحل قبلی ایجاد کردهاید، اضافه کنید:
server {
listen 443 ssl;
listen [::]:443 ssl;
include snippets/self-signed.conf;
include snippets/ssl-params.conf;
root /var/www/your_domain/html;
index index.html index.htm index.nginx-debian.html;
server_name your_domain.com www.your_domain.com;
location / {
try_files $uri $uri/ =404;
}
}
در مرحله بعد، یک بلوک سرور دوم را به فایل پیکربندی پس از بسته شدن براکت (}) بلوک اول اضافه کنید:
server {
listen 80;
listen [::]:80;
server_name your_domain.com www.your_domain.com;
return 302 https://$server_name$request_uri;
}
این یک پیکربندی بدون استخوان است که به پورت 80 گوش می دهد و تغییر مسیر را به HTTPS انجام می دهد. پس از اتمام ویرایش فایل را با فشار دادن CTRL + X و سپس Y و ENTER ذخیره کرده و ببندید.
مرحله 3 – تنظیم فایروال
اگر فایروال ufw را فعال کرده اید، همانطور که توسط راهنمای پیش نیاز توصیه شده است، باید تنظیمات را برای اجازه دادن به ترافیک SSL تنظیم کنید. خوشبختانه، Nginx پس از نصب، چند نمایه را با ufw ثبت می کند.
می توانید با تایپ کردن نمایه های موجود را مرور کنید:
sudo ufw app list
لیستی مانند شکل زیر ظاهر می شود:
Output
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
با تایپ وضعیت sudo ufw می توانید تنظیمات فعلی را بررسی کنید:
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، باید خروجی زیر را دریافت کنید:
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)
این خروجی تأیید می کند که تنظیمات فایروال شما با موفقیت انجام شده است و شما آماده فعال کردن تغییرات در Nginx هستید.
مرحله 4 – فعال کردن تغییرات در Nginx
با تکمیل تغییرات و تنظیمات فایروال خود، می توانید Nginx را مجددا راه اندازی کنید تا تغییرات جدید را اعمال کنید.
ابتدا بررسی کنید که هیچ خطای نحوی در فایل ها وجود نداشته باشد. می توانید این کار را با تایپ sudo nginx -t انجام دهید:
sudo nginx -t
اگر همه چیز موفقیت آمیز باشد، نتیجه ای دریافت خواهید کرد که به شرح زیر است:
Output
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/ssl/certs/nginx-selfsigned.crt"
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
به هشدار در ابتدا توجه کنید. همانطور که قبلا ذکر شد، این تنظیم خاص یک هشدار ایجاد می کند زیرا گواهی امضا شده شما نمی تواند از منگنه SSL استفاده کند. این مورد انتظار است و سرور شما همچنان می تواند اتصالات را به درستی رمزگذاری کند.
اگر خروجی شما با مثال ما مطابقت داشته باشد، فایل پیکربندی شما هیچ خطای نحوی ندارد. اگر اینطور است، می توانید با خیال راحت Nginx را مجدداً راه اندازی کنید تا تغییرات را اعمال کنید:
sudo systemctl restart nginx
اکنون که سیستم با تغییرات جدید راه اندازی مجدد شده است، می توانید به تست ادامه دهید.
مرحله 5 – تست رمزگذاری
اکنون، شما آماده آزمایش سرور SSL خود هستید.
مرورگر وب خود را باز کنید و https:// و سپس نام دامنه یا IP سرور خود را در نوار آدرس تایپ کنید:
بسته به مرورگر خود، احتمالاً هشداری دریافت خواهید کرد زیرا گواهی ایجاد شده توسط یکی از مقامات گواهی معتبر مرورگر شما امضا نشده است:
این هشدار قابل انتظار و طبیعی است. ما فقط به جنبه رمزگذاری گواهینامه خود علاقه مند هستیم، نه تأیید اعتبار شخص ثالث اعتبار میزبان خود. روی “پیشرفته” و سپس لینک ارائه شده برای رفتن به میزبان خود کلیک کنید:
در این مرحله، شما باید به سایت خود منتقل شوید. در مثال ما، نوار آدرس مرورگر یک قفل با علامت “x” روی آن نشان می دهد، که به این معنی است که گواهی نمی تواند تأیید شود. هنوز هم اتصال شما را رمزگذاری می کند. توجه داشته باشید که این نماد بسته به مرورگر شما ممکن است متفاوت باشد.
اگر Nginx را با دو بلوک سرور پیکربندی کردهاید، بهطور خودکار محتوای HTTP را به HTTPS هدایت میکنید، همچنین میتوانید بررسی کنید که آیا تغییر مسیر به درستی عمل میکند یا خیر:
اگر به همان نماد منجر شد، به این معنی است که تغییر مسیر شما به درستی کار کرده است.
مرحله 6 – تغییر به یک تغییر مسیر دائمی
اگر تغییر مسیر شما به درستی کار کرد و مطمئن هستید که میخواهید فقط به ترافیک رمزگذاری شده اجازه دهید، باید پیکربندی Nginx را تغییر دهید تا تغییر مسیر دائمی شود.
فایل پیکربندی بلوک سرور خود را دوباره باز کنید:
sudo nano /etc/nginx/sites-available/your_domain
بازگشت 302 را پیدا کرده و آن را به برگردان 301 تغییر دهید:
return 301 https://$server_name$request_uri;
با فشار دادن CTRL + X و سپس Y و ENTER فایل را ذخیره کرده و ببندید
تنظیمات خود را برای خطاهای نحوی بررسی کنید:
sudo nginx -t
وقتی آماده شدید، Nginx را مجددا راه اندازی کنید تا تغییر مسیر دائمی شود:
sudo systemctl restart nginx
پس از راه اندازی مجدد، تغییرات اعمال می شود و تغییر مسیر شما اکنون دائمی است.
نتیجه
شما سرور Nginx خود را برای استفاده از رمزگذاری قوی برای اتصالات مشتری پیکربندی کرده اید. این به شما امکان می دهد تا درخواست ها را به صورت ایمن ارائه کنید و از خواندن ترافیک شما توسط طرف های خارجی جلوگیری کنید. از طرف دیگر، میتوانید از یک گواهی SSL خودامضا استفاده کنید که میتوان آن را از Let’s Encrypt دریافت کرد، یک مرجع گواهی که گواهیهای رایگان TLS/SSL را نصب میکند و HTTPS رمزگذاری شده را در سرورهای وب فعال میکند.