Skip to main content

[Thủ Thuật Linux] Hướng dẫn bảo mật Nginx bằng Let's Encrypt trên CentOS 7

Giới thiệu Let’s Encrypt

Let’s Encrypt là Tổ chức phát hành chứng chỉ (CA) mới cung cấp cách dễ dàng để lấy và cài đặt chứng chỉ TLS / SSL miễn phí, do đó cho phép HTTPS được mã hóa trên máy chủ web.

Certbot được tự động hóa hầu hết (nếu không phải tất cả) các bước cần thiết để lấy và cài đặt chứng chỉ TLS /SSL hoàn toàn tự động trên cả máy chủ web Apache và Nginx.

Trong hướng dẫn này, chúng tôi sẽ chỉ cho bạn cách sử dụng ứng dụng Certbot Let’s Encrypt để lấy chứng chỉ SSL miễn phí và sử dụng nó với Nginx trên CentOS 7. Chúng tôi cũng sẽ hướng dẫn bạn cách tự động gia hạn chứng chỉ SSL của mình trên Nginx.

Bước 1 - Cài đặt Certbot Let’s Encrypt Client

Bước đầu tiên để sử dụng Let’s Encrypt để lấy chứng chỉ SSL là cài đặt phần mềm certbot trên máy chủ của bạn. Hiện tại, cách tốt nhất để cài đặt nó là thông qua EPEL repository.

Đầu tiên cấp phép truy cập vào EPEL repository trên máy chủ của bạn bằng cách nhập:

sudo yum install epel-release

Sau đó tải và cài đặt certbot-nginx bằng :

sudo yum install certbot-nginx

Vậy là xong quá trình cài đặt Certbot Let’s Encrypt Client

Bước 2 - Cập nhập lại Firewall

Nếu bạn đã bật tường lửa, hãy đảm bảo rằng cổng 80 và 443 được mở cho phép truy cập đến. Nếu bạn không chạy tường lửa, bạn có thể bỏ qua.

Nếu bạn đang chạy tường lửa firewalld, bạn có thể mở các cổng này bằng cách gõ:

sudo firewall-cmd --add-service=http
sudo firewall-cmd --add-service=https
sudo firewall-cmd --runtime-to-permanent

Nếu tường lửa iptables đang chạy, các lệnh bạn cần chạy phụ thuộc nhiều vào các setting hiện tại của bạn. Đối với setting cơ bản, bạn có thể thêm quyền truy cập HTTP và HTTPS bằng cách nhập:

sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT

Bây giờ, server đã sẵn sàng chạy Certbot

Bước 3 - Lấy chứng chỉ SSL

Certbot cung cấp nhiều cách khác nhau để lấy chứng chỉ SSL nhưng chúng ta sử dụng cách đơn giản cho Nginx bằng lệnh:

sudo certbot --nginx -d example.com -d www.example.com

Lệnh trên này là chạy certbot với plugin --nginx, sử dụng -d để chỉ định các tên mà chúng tôi muốn chứng chỉ hợp lệ.

Nếu đây là lần đầu tiên bạn chạy certbot, bạn sẽ được nhắc nhập địa chỉ email và đồng ý với các điều khoản dịch vụ.

Sau khi làm như vậy, certbot sẽ giao tiếp với máy chủ Let’s Encrypt, sau đó chạy thử thách để xác minh rằng bạn kiểm soát miền mà bạn đang yêu cầu chứng chỉ.

Nếu điều đó thành công, certbot sẽ hỏi bạn muốn định cấu hình cài đặt HTTPS của mình như thế nào:

Output
Please choose whether HTTPS access is required or optional.
-------------------------------------------------------------------------------
1: Easy - Allow both HTTP and HTTPS access to these sites
2: Secure - Make all requests redirect to secure HTTPS access
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

Chọn lựa chọn của bạn rồi nhấn ENTER.

Cấu hình sẽ được cập nhật và Nginx sẽ tải lại để chọn cài đặt mới và certbot sẽ kết thúc bằng một thông báo cho bạn biết quá trình đã thành công và nơi lưu trữ chứng chỉ của bạn:

Output
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
   expire on 2017-10-23. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot again with the
   "certonly" option. 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

Bây giờ bạn đã cài đặt xong SSL, bạn có thể reload trang để kiểm tra sự xuất hiện của https: hay icon lock màu xanh hoặc sử dụng tool để check SSL tại đây.

Bước 4 - Cài đặt Cronjob tự động gia hạn SSL

Chứng chỉ của Let’s Encrypt chỉ có giá trị trong 90 ngày. Do vậy, chúng ta sẽ cần thiết lập lệnh chạy thường xuyên để kiểm tra các chứng chỉ hết hạn và tự động gia hạn chúng thay vì dùng lệnh bằng tay.

Để chạy kiểm tra và gia hạn hàng ngày, chúng tôi phải thực hiện bằng cách mở và chỉnh sửa một tệp có tên là crontab.

sudo crontab -e

Thêm đoạn code dưới và đóng lại file

15 3 * * * /usr/bin/certbot renew --quiet

Phần 15 3 * * * của dòng này có nghĩa là “chạy lệnh sau vào lúc 3:15 sáng, mỗi ngày”. Bạn có thể chọn bất kỳ lúc nào bằng thay đổi tham số đó. 

Để hiểu hơn Cronjob bạn có thể xem bài viết "Hướng dẫn cài đặt Cronjob ".

Lệnh gia hạn cho Certbot sẽ kiểm tra tất cả các chứng chỉ được cài đặt trên hệ thống và cập nhật bất kỳ chứng chỉ nào hết hạn trong vòng chưa đầy ba mươi ngày.

--quiet yêu cầu Certbot không xuất thông tin hoặc chờ người dùng nhập.

cron bây giờ sẽ chạy lệnh này hàng ngày. Tất cả các chứng chỉ đã cài đặt sẽ tự động được gia hạn và tải lại khi chúng còn dưới ba mươi ngày hoặc ít hơn trước khi hết hạn.

Bước 5 - Bật gia hạn SSL tự động từ gói package certbot

Bộ tự động gia hạn SSL từ package certbot có sẵn nhưng bị disable, bật nó lên để tự kiểm tra và gia hạn 2 lần 1 ngày

sudo systemctl enable --now certbot-renew.timer

##output 
Created symlink from /etc/systemd/system/timers.target.wants/certbot-renew.timer to /usr/lib/systemd/system/certbot-renew.timer. 

## check status
sudo systemctl status certbot-renew.timer