Let’s Encrypt là tổ chức phát hành chứng chỉ (Certificate Authority – CA) mới, cung cấp phương thức để nhận và cài đặt chứng chỉ TLS/SSL miễn phí, qua đó cho phép bật HTTPS đã được mã hóa trên các máy chủ web.
Quá trình này được tinh giản hóa nhờ một client phần mềm có tên gọi là Certbot, với khả năng tự động hóa hầu hết (có thể nói là tất cả) các bước cần thiết. Hiện tại, toàn bộ quy trình nhận và cài đặt chứng chỉ đã được tự động hóa hoàn toàn trên web server của cả Apache và Nginx.
Trong bài viết này, chúng tôi sẽ hướng dẫn bạn cách bảo mật Nginx bằng Let’s Encrypt trên CentOS 7 bằng cách sử dụng client Certbot để nhận chứng chỉ SSL miễn phí. Chúng tôi cũng sẽ hướng dẫn cách tự động gia hạn chứng chỉ SSL.
Điều kiện tiên quyết
Trước khi làm theo bài hướng dẫn này, bạn cần chuẩn bị một vài thứ như sau:
- Máy chủ CentOS 7 và một tài khoản người dùng (non-root) có quyền
sudo
. - Bạn phải sở hữu hoặc kiểm soát tên miền đã đăng ký mà bạn muốn sử dụng để cài đặt chứng chỉ. Nếu chưa có tên miền, bạn có thể đăng ký tại một trong nhiều nhà cung cấp tên miền (ví dụ: Namecheap, GoDaddy, v.v.).
- Một bản ghi DNS
A Record
trỏ tên miền của bạn đến địa chỉ IP công khai của máy chủ. Yêu cầu này là bắt buộc vì Let’s Encrypt sử dụng để xác minh rằng bạn thực sự sở hữu tên miền trước khi cấp chứng chỉ. Ví dụ, nếu bạn muốn cấp chứng chỉ cho tên miềnexample.com
, tên miền đó phải trỏ về máy chủ của bạn thì quá trình xác thực mới thành công. Vì cấu hình của chúng ta sẽ cần sử dụngexample.com
vàwww.example.com
làm tên miền nên bạn cần có cả hai bản ghi DNS này.
Sau khi đã đáp ứng đủ các điều kiện tiên quyết, chúng ta hãy chuyển sang bước cài đặt client phần mềm của Let’s Encrypt.
Các bước bảo mật Nginx bằng Let’s Encrypt trên CentOS 7
Bước 1: Cài đặt Client Certbot của Let’s Encrypt
Bước đầu tiên để sử dụng Let’s Encrypt và cấp chứng chỉ SSL là cài đặt công cụ Certbot trên máy chủ. Hiện tại, cách tốt nhất để cài đặt là thông qua EPEL repository.
Kích hoạt quyền truy cập vào EPEL repository trên máy chủ bằng cách gõ lệnh:
sudo yum install epel-release
Sau khi kho lưu trữ đã được kích hoạt, bạn có thể tải gói certbot-nginx
bằng cách gõ:
sudo yum install certbot-nginx
Đến đây, Client certbot
của Let’s Encrypt đã hoàn tất cài đặt và có thể bắt đầu sử dụng ngay.
Bước 2: Cấu hình Nginx
Nếu chưa có Nginx, bạn có thể cài đặt ngay bây giờ. EPEL repository đã được kích hoạt từ bước 1, vì vậy bạn có thể cài đặt Nginx bằng lệnh sau:
sudo yum install nginx
Sau đó, khởi động Nginx bằng systemctl
:
sudo systemctl start nginx
Certbot có thể tự động cấu hình SSL cho Nginx, nhưng nó cần tìm đúng khối server
trong file cấu hình. Nó thực hiện việc này bằng cách tìm một chỉ thị server_name
khớp với tên miền mà bạn đang yêu cầu chứng chỉ. Nếu bạn mới cài đặt Nginx, bạn có thể cập nhật file cấu hình mặc định bằng vi
hoặc trình soạn thảo văn bản mà bạn yêu thích:
sudo vi /etc/nginx/nginx.conf
Tìm dòng server_name
hiện có:
/etc/nginx/nginx.conf
server_name _;
Thay thế dấu gạch dưới _
bằng tên miền của bạn:
server_name example.com www.example.com;
Lưu file và thoát khỏi trình soạn thảo. Nếu bạn đang dùng vi
, nhập :x
, sau đó nhấn y
khi được hỏi, để lưu và thoát. Kiểm tra cú pháp của các thay đổi cấu hình bằng lệnh:
sudo nginx -t
Nếu lệnh chạy mà không có lỗi thì tải lại Nginx để áp dụng cấu hình mới:
sudo systemctl reload nginx
Lúc này, Certbot đã có thể tìm thấy và cập nhật khối server
. Kế đến, chúng ta sẽ cập nhật tường lửa để cho phép lưu lượng truy cập HTTPS.
Bước 3: Cập nhật tường lửa (Firewall)
Nếu đang chạy tường lửa, bạn cần đảm bảo cổng 80 và 443 đang mở cho lưu lượng truy cập đến. Nếu không, bạn có thể bỏ qua bước này.
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 bạn có tường lửa iptables
, các lệnh bạn cần chạy phụ thuộc rất nhiều vào bộ rule hiện tại. Đối với một bộ rule ban đầu, bạn có thể thêm quyền truy cập HTTP và HTTPS bằng cách gõ:
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ờ, chúng ta đã có thể chạy Certbot và lấy chứng chỉ.
Bước 4: Nhận chứng chỉ
Có nhiều cách để nhận chứng chỉ SSL bằng Certbot thông qua các plugin khác nhau. Plugin Nginx sẽ đảm nhận nhiệm vụ tái cấu hình Nginx và tải lại file config khi cần thiết:
sudo certbot --nginx -d example.com -d www.example.com
Lệnh này chạy certbot
với plugin --nginx
, sử dụng -d
để chỉ định các tên miền mà chúng ta muốn nhận chứng chỉ.
Nếu đây là lần đầu tiên bạn chạy certbot
, bạn sẽ phải nhập địa chỉ email và đồng ý với các điều khoản dịch vụ. Sau khi hoàn tất, certbot
sẽ liên lạc với máy chủ Let’s Encrypt, sau đó chạy một challenge để xác minh rằng bạn kiểm soát tên miền mà bạn đang yêu cầu cấp chứng chỉ. File cấu hình sẽ được cập nhật, đồng thời Nginx sẽ tải lại để nhận các thiết lập mới. Khi hoàn tất, certbot
sẽ gửi thông báo cho biết quá trình đã thành công và nơi lưu trữ các chứng chỉ:
Output
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/your_domain/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/your_domain/privkey.pem
Your certificate will expire on 2022-10-20. 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"
- 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>
Chứng chỉ của bạn đã được tải về, cài đặt và áp dụng thành công. Bạn có thể kiểm tra bằng cách truy cập lại trang web với địa chỉ bắt đầu bằng https://
và để ý chỉ báo bảo mật của trình duyệt. Trình duyệt sẽ hiển thị biểu tượng ổ khóa màu xanh lá cây cho biết trang web đã được bảo mật an toàn.
Bước 5: Thiết lập tự động gia hạn
Chứng chỉ của Let’s Encrypt chỉ có hiệu lực trong 90 ngày nhằm khuyến khích người dùng tự động hóa quy trình gia hạn chứng chỉ của mình. Chúng ta sẽ cần thiết lập một lệnh chạy định kỳ để kiểm tra các chứng chỉ sắp hết hạn và tự động gia hạn.
Để chạy kiểm tra gia hạn hàng ngày, chúng ta sẽ sử dụng cron
, đây là dịch vụ hệ thống tiêu chuẩn để chạy các công việc định kỳ. Chúng ta chỉ định công việc cho cron
bằng cách mở và chỉnh sửa một file gọi là crontab
.
sudo crontab -e
Trình soạn thảo văn bản của bạn sẽ mở crontab
mặc định, đang là một file văn bản trống. Dán dòng sau vào rồi lưu và đóng 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ỳ thời điểm nào khác.
Lệnh renew
của 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 sắp hết hạn trong vòng 30 ngày. --quiet
yêu cầu Certbot không xuất thông tin hoặc chờ người dùng nhập liệu.
Giờ thì cron
sẽ chạy lệnh này hàng ngày. Tất cả các chứng chỉ đã cài đặt sẽ được tự động gia hạn và tải lại khi chúng còn tối đa 30 ngày trước khi hết hạn.
Kết luận
Trong bài hướng dẫn này, chúng ta đã cài đặt client certbot
của Let’s Encrypt, tải chứng chỉ SSL cho tên miền, cấu hình Nginx để sử dụng các chứng chỉ này và thiết lập tự động gia hạn chứng chỉ. Nếu bạn vẫn còn thắc mắc về cách sử dụng Certbot, bạn có thể tham khảo thêm tài liệu tại trang web chính thức của certbot.