Let’s Encrypt

امن کردن Nginx با Let’s Encrypt در اوبونتو 18.04

Let’s Encrypt یک مجوز متن-باز و رایگان است که توسط گروه Internet Security Research Group (ISRG) توسعه داده شده است. گواهی صادر شده توسط Let’s Encrypt در بیشتر مرورگر ها تایید شده هستند.

در این آموزش نحوه نصب Let’s Encrypt بصورت قدم به قدم در لینوکس اوبونتو 18.04 شرح داده شده است.

پیش نیاز

نصب Certbot

Cerbot یک ابزار ویژه است، که می توانید یک گواهی نامه SSL تهیه و یا آن را در وب سرور خود تمدید کنید. پکیج Certbot در مخازن پیش فرض اوبونتو موجود است.

sudo apt update
sudo apt install certbot

ایجاد یک (Dh (Diffie-Hellman

کلید Diffie–Hellman روشی برای تبادل کلیدهای رمزنگاری بر روی کانال ارتباطی ناامن است. ما در آموزش برای امنیت بیشتر مجموعه جدیدی از پارامترهای DH 2048 تولید میکنیم.

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

اخذ Let’s Encrypt SSL

برای به دست آوردن گواهینامه SSL برای دامنه، ما می خواهیم از افزونه Webroot استفاده کنیم که با ایجاد یک پرونده موقت برای تأیید دامنه درخواست شده در دایرکتوری
${webroot-path}/.well-known/acme-challenge قرار دارد.
سرور رمزگذاری شده اجازه می دهد تا درخواست HTTP را به پرونده موقتی ارسال کند تا اعتبار دامنه درخواست شده را به سرور محل اجرای Certbot تأیید کند.

برای ساده تر کردن موضوع میخواهیم همه درخواست های HTTP را
.well-known/acme-challenge در یک دایرکتوری /var/lib/letsencrypt ترسیم کنیم.

دستورات زیر دایرکتوری ایجاد کرده و آن را برای سرور Nginx قابل نوشتن درآورده است.

sudo mkdir -p /var/lib/letsencrypt/.well-known
sudo chgrp www-data /var/lib/letsencrypt
sudo chmod g+s /var/lib/letsencrypt

برای جلوگیری از کپی کردن کد ، دو قطعه زیر را ایجاد کنید که می خواهیم همه فایلهای بلوک سرور Nginx را در آن وارد کنیم.

توسط یک ادیتور قطعه letsencrypt.conf را بسازید و مقادیر زیر را در آن قرار دهید :

sudo nano /etc/nginx/snippets/letsencrypt.conf
location ^~ /.well-known/acme-challenge/ {
  allow all;
  root /var/lib/letsencrypt/;
  default_type "text/plain";
  try_files $uri =404;
}

حال دومین قطعه را نیز با نام ssl.conf میسازیم. این فایل شامل یکسری چیپ توصیه شده Mozilla است که شامل :
(OCSP Stapling , HTTP Strict Transport Security (HSTS و چند هدر HTTP که بر امنیت تاکید دارد فعال میکند.

sudo nano /etc/nginx/snippets/ssl.conf

محتویات دستور بالا :

ssl_dhparam /etc/ssl/certs/dhparam.pem;

ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;

ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 30s;

add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;

پس از ایجاد قطعه ، بلوک سرور دامنه را باز کنید و قطعه letsencrypt.conf را مانند شکل زیر وارد کنید:

sudo nano /etc/nginx/sites-available/example.com.conf
server {
  listen 80;
  server_name example.com www.example.com;

  include snippets/letsencrypt.conf;
}

برای فعال کردن پرونده بلاک سرور جدید ، باید یک symbolic link از فایل به sites-enabled ایجاد کنیم ، که توسط Nginx هنگام راه اندازی خوانده می شود :

/sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled

حال سرویس را Restart میکنیم تا تغییرات اعمال شوند :

sudo systemctl restart nginx

اکنون می توانید Certbot را با افزونه webroot برای بدست آوردن پرونده های گواهینامه SSL :

sudo certbot certonly --agree-tos --email admin@example.com --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com

بخش های admin@example.com | example.com | www.example.com را با مقادیر خود تغییر دهید

اگر گواهی SSL با موفقیت به دست بیاید ، certbot پیام زیر را چاپ می کند :

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.com/privkey.pem
   Your cert will expire on 2018-07-28. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

اکنون که پرونده های گواهی نامه را دارید ، می توانید بلوک سرور دامنه خود را به صورت زیر ویرایش کنید:

sudo nano /etc/nginx/sites-available/example.com.conf
server {
    listen 80;
    server_name www.example.com example.com;

    include snippets/letsencrypt.conf;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    include snippets/ssl.conf;
    include snippets/letsencrypt.conf;

    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    include snippets/ssl.conf;
    include snippets/letsencrypt.conf;

    # . . . other code
}

با پیکربندی فوق ، ما HTTPS را مجبور می کنیم و از www به نسخه غیر www هدایت شود.

برای اعمال تغییرات دوباره وب سرور را Reload میکنیم :

sudo systemctl reload nginx

تمدید خودکار Let’s Encrypt SSL certificate

اعتبار Let’s Encrypt’s  تا 90 روز است. برای تمدید خودکار گواهینامه ها قبل از انقضا، ما یک Cronjob ایجاد میکنیم که دو بار در روز اجرا میشود و 30 روز قبل از انقضا گواهینامه آن را تمدید میکند :

از آنجایی که ما از پلاگین Cerbot Webroot استفاده میکنیم پس از تمدید لازم است سرویس Nginx یک بار Reload شود.

برای ایجاد فایل Cron :

sudo nano /etc/cron.d/certbot

ما دستور “renew-hook “systemctl reload nginx– مانند زیر برای Reload کردن اضافه میکنیم :

0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --renew-hook "systemctl reload nginx"

برای اطمینان از کار کردن Cron با سوییچ dry-run– آن را تست میکنیم :

sudo certbot renew --dry-run

اگر خطایی مشاهده نکردید، به معنی پروسس تمدید خودکار به خوبی کار میکند.

نتیجه

در این آموزش ، شما از سرویس دهنده Letry Encrypt ، certbot از دانلود گواهی های SSL برای دامنه خود استفاده کرده اید. شما همچنین برای جلوگیری از کپی کردن از کد ، قطعه های Nginx ایجاد کرده اید و Nginx را برای استفاده از گواهی ها پیکربندی کرده ایم. در پایان آموزش، شما Cronjob را برای تمدید خودکار گواهی تنظیم کرده اید.

اگر می خواهید در مورد نحوه استفاده از Certbot بیشتر بدانید ، مستندات آنها نقطه شروع خوبی است.

درباره AfshinBalakar

افشین بالاکار دانشجوی مهندسی تکنولوژی نرم افزار، مدت 5 سال است با لینوکس رابطه افلاطونی دارم.

پیشنهاده میشه بخونی

نصب آپاچی در اوبونتو 20.04، راه اندازی وب سرور در ubuntu

آموزش نصب Apache در اوبونتو 20.04

Apache یکی از محبوب ترین سرورهای وب در جهان است. این سرور HTTP با منبع …

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *