Let’s Encrypt، یک مرجع صدور گواهینامه رایگان و منبع باز است که توسط گروه تحقیقات امنیت اینترنت (ISRG) توسعه یافته است. گواهی‌های صادر شده توسط Let’s Encrypt امروزه تقریباً مورد اعتماد همه مرورگرها هستند.

در این آموزش، بصورت گام به گام با دستورالعمل‌های ایمن سازی Nginx بوسیله Let’s Encrypt با استفاده از ابزار certbot در CentOS 7 آشنا خواهید شد.

 

دقت کنید که در این آموزش، از example.com به عنوان دامنه استفاده شده است و شما باید آن را با دامنه‌ای که به IP عمومی شما اشاره دارد، جایگزین نمایید.

نکته: قبل از نصب Nginx، ابتدا مخزن EPEL را فعال کرده و سپس Nginx را نصب نمایید.

 

نصب Certbot

Certbot، ابزاری با کاربرد آسان است که می‌تواند مراحل بدست آوردن و تمدید گواهی Let’s Encrypt SSL و پیکربندی وب سرورها را به صورت خودکار انجام دهد.

به منظور نصب بسته certbot، از مخزن EPEL به صورت زیر استفاده کنید:

sudo yum install certbot

 

تولید گروه DH (دیفی هلمن/Diffi-Helman) قوی

تبادل کلید Diffie–Hellman، روشی برای تبادل ایمن کلیدهای رمزنگاری از طریق یک کانال ارتباطی ناامن است.

با وارد کردن دستور زیر می‌توانید، یک مجموعه جدید از پارامترهای 2048 بیتی DH ایجاد نمایید:

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

دقت کنید که در صورت نیاز می‌توانید، اندازه کلید را تا 4096 بیت تغییر دهید؛ اما در این صورت، بسته به آنتروپی سیستم، ممکن است تولید آن بیش از 30 دقیقه طول بکشد.

 

دریافت گواهی Let’s Encrypt SSL

در اینجا، به منظور به دست آوردن یک گواهی SSL برای دامنه خود، از افزونه Webroot استفاده می‌کنیم که با ایجاد یک فایل موقت برای اعتبار سنجی دامنه درخواست شده در دایرکتوری ${webroot-path}/.well-known/acme-chllenge کار می‌کند. بدین صورت، سرور Let’s Encrypt درخواست‌های HTTP را به فایل موقت ارسال می‌نماید تا تأیید کند که دامنه درخواستی به آدرس سرور میزبان certbot نگاشت می‌شود.

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

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

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

 

به منظور جلوگیری از کپی کردن کد و صرفه جویی در وقت، کافیست دو فایل پیکربندی زیر را ایجاد کرده و قطعه کدهای نشان داده شده را در آن وارد نمایید. سپس آن‌ها را در تمام فایل‌های بلوک سرور Nginx قرار دهید:

sudo mkdir /etc/nginx/snippets
                  /etc/nginx/snippets/letsencrypt.conf

location ^~ /.well-known/acme-challenge/ {
  allow all;
  root /var/lib/letsencrypt/;
  default_type "text/plain";
  try_files $uri =404;
}
                  /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;

 

این قطعه کدها، شامل تنظیمات پیشنهادی مرورگر Mozilla است که قابلیت‌های OCSP Stapling و HTTP Strict Transport Security (HSTS) را فعال کرده و تعداد کمی از هدرهای HTTP مربوط به امنیت را اعمال می‌نماید.

پس از آن، فایل مربوط به دامنه خود را باز کرده و قطعه کد letsencrypt.conf را مانند تصویر زیر وارد نمایید:

              /etc/nginx/conf.d/example.com.conf

server {
  listen 80;
  server_name example.com www.example.com;

  include snippets/letsencrypt.conf;
}

به منظور اعمال تغییرات، پیکربندی Nginx را مجدداً بارگیری کنید:

sudo systemctl reload 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

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

Output:
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-06-11. 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"
 - 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

 

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

                 /etc/nginx/conf.d/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 هدایت می‌کنید.

سرانجام، سرویس Nginx را بارگیری نمایید تا تغییرات اعمال شود:

sudo systemctl reload nginx

 

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

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

دستور crontab را برای ایجاد یک cronjob جدید، بصورت زیر اجرا نمایید:

sudo crontab -e

سپس خطوط زیر را جایگذاری کنید:

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"

در پایان فایل را ذخیره کرده و آن را ببندید.

 

به منظور آزمایش روند تمدید گواهی می‌توانید، از دستور certbot و به دنبال آن –dry-run استفاده نمایید:

sudo certbot renew --dry-run

اگر خطایی وجود نداشته باشد، به این معنی است که روند تمدید بصورت موفقیت آمیز انجام می‌شود.

 

 

 

منبع:

linuxize