Skip to main content

[Thủ Thuật Linux] Bảo mật Nginx với Let's Encrypt trên CentOS 8

Let’s Encrypt là một tổ chức cung cấp chứng chỉ mở, tự động và miễn phí được phát triển bởi Internet Security Research Group (ISRG) cung cấp chứng chỉ SSL miễn phí.

Chứng chỉ do Let’s Encrypt cấp được tất cả các trình duyệt chính tin cậy và có giá trị trong 90 ngày kể từ ngày cấp.

Trong hướng dẫn này, chúng tôi sẽ cung cấp hướng dẫn từng bước về cách cài đặt chứng chỉ SSL miễn phí trên CentOS 8 chạy Nginx và hướng dẫn cách định cấu hình Nginx để sử dụng chứng chỉ SSL và bật HTTP / 2.

Yêu cầu

- Có domain như example.com 

- CentOS Server đã cài Nginx

- Firewall đã mở cổng 80 và 443

Bước 1 - Cài đặt Certbot

Gói Certbot không được bao gồm trong CentOS 8 repositories chuẩn, nhưng nó có thể được tải xuống từ trang web của nhà cung cấp.

Chạy lệnh wget sau với quyền root hoặc sudo để tải tập lệnh certbot xuống thư mục / usr / local / bin:

sudo wget -P /usr/local/bin https://dl.eff.org/certbot-auto

Cấp quyền để file thực thi

sudo chmod +x /usr/local/bin/certbot-auto

Bước 2 - Tạo Diffie–Hellman key exchange (DH)

Diffie–Hellman key exchange (DH) là một phương pháp trao đổi khóa mật mã một cách an toàn.

Tại một DH 2048 bit bằng lệnh: 

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

Bước 3 - Lấy chứng chỉ SSL của Let’s Encrypt

Để có chứng chỉ SSL cho tên miền, chúng ta sẽ sử dụng plugin Webroot hoạt động bằng cách tạo tệp tạm thời để xác thực tên miền được yêu cầu trong thư mục $ {webroot-path} /. Well-known / acme-challenge.

Máy chủ Let’s Encrypt sẽ thực hiện các yêu cầu HTTP tới tệp tạm thời để xác thực rằng tên miền được yêu cầu gửi tới máy chủ nơi certbot chạy.

Để đơn giản hơn, chúng tôi sẽ ánh xạ tất cả các yêu cầu HTTP cho .well-known / acme-challenge vào một thư mục duy nhất, / var / lib / letsencrypt.

Các lệnh sau sẽ tạo thư mục và làm cho nó có thể ghi được cho Nginx

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

Để tránh trùng lặp, hãy tạo hai snippets và sẽ được bao gồm trong tất cả các khối server của Nginx:

sudo mkdir /etc/nginx/snippets

Snippets 1:  /etc/nginx/snippets/letsencrypt.conf

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

Snippets 2:  /etc/nginx/snippets/ssl.conf

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

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

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;

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=63072000" always;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;

Đoạn trên bao gồm các trình cắt do Mozilla đề xuất, cho phép Ghim Stapling , HTTP Strict Transport Security (HSTS) và thực thi một số bảo mật HTTP.

Khi các snippets được tạo, hãy mở khối server tên miền và thêm đoạn code như dưới:

#/etc/nginx/conf.d/example.com.conf
server {
  listen 80;
  server_name example.com www.example.com;

  include snippets/letsencrypt.conf;
}

Reload Nginx

sudo systemctl reload nginx

Chạy certbot bằng plugin webroot để lấy chứng chỉ tên miền:

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

Kết quả thành công như:

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 2020-03-12. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto 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

Bây giờ bạn có file certificate, sau đó bạn edit lại khối server như sau:

# /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
}

Với cấu hình ở trên, chúng ta đang buộc sủ dụng HTTPS và chuyển hướng phiên bản www sang non-www.

Cuối cùng là reload Nginx

sudo systemctl reload nginx

Bước 4- Hướng dẫn cài đặt tự động gia hạn Let’s Encrypt SSL certificate

Sử dụng crontab để tạo một cronjob

sudo crontab -e

Dán đoạn mã dưới vào và lưu lại

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

Để kiểm tra quá trình gia hạn, bạn có thể sử dụng lệnh certbot, theo sau là --dry-run:

sudo ./certbot-auto renew --dry-run