Trong hướng dẫn này, bạn sẽ học cách bảo mật Nginx với Let’s Encrypt trên Ubuntu bằng cách sử dụng Certbot để lấy chứng chỉ SSL miễn phí và thiết lập quá trình gia hạn tự động.
Let’s Encrypt là một Certificate Authority (tổ chức cấp chứng chỉ) cung cấp một cách tiếp cận dễ dàng để lấy và cài đặt các chứng chỉ TLS/SSL miễn phí, từ đó cho phép mã hóa HTTPS trên các máy chủ web.
Nó đơn giản hóa quy trình bằng cách cung cấp một phần mềm client, Certbot, cố gắng 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. Hiện tại, toàn bộ quá trình lấy và cài đặt chứng chỉ đã được tự động hóa hoàn toàn trên cả Apache và Nginx.
Hướng dẫn này sẽ sử dụng một tệp cấu hình máy chủ Nginx riêng biệt thay vì tệp mặc định. Chúng tôi khuyên bạn nên tạo các tệp server block Nginx mới cho mỗi tên miền vì điều này giúp tránh các lỗi phổ biến và duy trì các tệp mặc định làm cấu hình dự phòng.
Cách bảo mật Nginx bằng Let’s Encrypt trên Ubuntu
- Cài đặt Certbot
- Xác nhận cấu hình của Nginx
- Mở cổng HTTPS trên tường lửa
- Lấy chứng chỉ SSL
- Xác minh việc tự động gia hạn của Certbot
->> Bài viết liên quan: Hướng dẫn bảo mật Nginx bằng Let’s Encrypt trên CentOS 7
Điều kiện tiên quyết
Để làm theo hướng dẫn này, bạn sẽ cần:
- Một máy chủ Ubuntu đã được thiết lập theo hướng dẫn “Thiết lập máy chủ ban đầu cho Ubuntu” này, bao gồm một người dùng không phải root có quyền sudo và một tường lửa.
- Một tên miền đã đăng ký. Hướng dẫn này sẽ sử dụng
example.com
xuyên suốt. Bạn có thể mua tên miền từ Namecheap, lấy miễn phí với Freenom, hoặc sử dụng nhà đăng ký tên miền bạn chọn. - Cả hai bản ghi DNS sau được thiết lập cho máy chủ của bạn. Nếu bạn đang sử dụng DigitalOcean, vui lòng xem tài liệu DNS của họ để biết chi tiết về cách thêm chúng.
- Một bản ghi A với
example.com
trỏ đến địa chỉ IP công cộng của máy chủ của bạn. - Một bản ghi A với
www.example.com
trỏ đến địa chỉ IP công cộng của máy chủ của bạn.
- Một bản ghi A với
- Nginx được cài đặt theo hướng dẫn “Cách cài đặt Nginx trên Ubuntu”. Đảm bảo rằng bạn có một server block cho tên miền của mình. Hướng dẫn này sẽ sử dụng
/etc/nginx/sites-available/example.com
làm ví dụ
Bước 1: Cài đặt Certbot
Certbot khuyến nghị sử dụng gói snap của họ để cài đặt. Các gói snap hoạt động trên hầu hết các bản phân phối Linux, nhưng chúng yêu cầu bạn đã cài đặt snapd
trước để quản lý các gói snap. Ubuntu đã hỗ trợ snap ngay từ đầu, vì vậy bạn có thể bắt đầu bằng cách đảm bảo snapd core của mình được cập nhật:
sudo snap install core; sudo snap refresh core
Nếu bạn đang làm việc trên một máy chủ mà trước đây đã cài đặt phiên bản certbot cũ hơn, bạn nên gỡ bỏ nó trước khi tiến hành:
sudo apt remove certbot
Sau đó, bạn có thể cài đặt gói certbot:
sudo snap install --classic certbot
Cuối cùng, bạn có thể liên kết lệnh certbot từ thư mục cài đặt snap vào đường dẫn của bạn, để bạn có thể chạy nó chỉ bằng cách gõ certbot
. Điều này không cần thiết với tất cả các gói, nhưng snap có xu hướng ít xâm phạm hơn theo mặc định, vì vậy chúng không xung đột với bất kỳ gói hệ thống nào khác một cách tình cờ:
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Bây giờ chúng ta đã hoàn thành cài đặt Certbot, hãy chạy nó để lấy chứng chỉ của chúng ta.
Bước 2: Xác nhận Cấu hình Nginx
Certbot yêu cầu tìm đúng server block trong cấu hình Nginx của bạn để tự động cấu hình SSL. Cụ thể, nó tìm kiếm một chỉ thị server_name
khớp với tên miền bạn yêu cầu cấp chứng chỉ.
Nếu bạn đã làm theo bước thiết lập server block trong hướng dẫn cài đặt Nginx, bạn sẽ có một server block cho tên miền của mình tại /etc/nginx/sites-available/example.com
với chỉ thị server_name
đã được đặt phù hợp.
Để kiểm tra, hãy mở tệp cấu hình cho tên miền của bạn bằng nano
hoặc trình soạn thảo văn bản yêu thích của bạn:
sudo nano /etc/nginx/sites-available/example.com
Tìm dòng server_name
hiện có. Nó sẽ trông như thế này:
/etc/nginx/sites-available/example.com
...
server_name example.com www.example.com;
...
Nếu đúng như vậy, hãy thoát trình soạn thảo và chuyển sang bước tiếp theo.
Nếu không, hãy cập nhật nó để khớp. Sau đó lưu tệp, thoát trình soạn thảo và xác minh cú pháp của các chỉnh sửa cấu hình của bạn:
sudo nginx -t
Nếu bạn gặp lỗi, hãy mở lại tệp server block và kiểm tra xem có lỗi chính tả hoặc thiếu ký tự nào không. Khi cú pháp tệp cấu hình của bạn đã đúng, hãy tải lại Nginx để tải cấu hình mới:
sudo systemctl reload nginx
Bây giờ Certbot có thể tìm thấy server block chính xác và cập nhật nó tự động.
Tiếp theo, hãy cập nhật tường lửa để cho phép lưu lượng HTTPS.
Bước 3: Cho phép HTTPS qua Tường lửa
Nếu bạn đã bật tường lửa ufw (như đã khuyến nghị trong các hướng dẫn điều kiện tiên quyết), bạn sẽ cần điều chỉnh cài đặt để cho phép lưu lượng HTTPS. May mắn thay, Nginx đã đăng ký một vài profile với ufw khi cài đặt.
Bạn có thể xem cài đặt hiện tại bằng cách gõ:
sudo ufw status
Nó có thể sẽ trông như thế này, có nghĩa là chỉ lưu lượng HTTP được phép đến máy chủ web:
Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)
Để cho phép thêm lưu lượng HTTPS, hãy cho phép profile Nginx Full và xóa quyền cho phép profile Nginx HTTP không cần thiết:
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'
Trạng thái của bạn bây giờ sẽ trông như thế này:
sudo ufw status
Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)
Tiếp theo, hãy chạy Certbot và lấy chứng chỉ của chúng ta.
Bước 4: Xin cấp Chứng chỉ SSL
Certbot cung cấp nhiều cách khác nhau để xin cấp chứng chỉ SSL thông qua các plugin. Plugin Nginx sẽ tự động cấu hình lại Nginx và tải lại cấu hình khi cần thiết. Để sử dụng plugin này, bạn gõ lệnh sau:
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 tên miền mà chúng ta muốn chứng chỉ có hiệu lực.
Khi chạy lệnh, bạn sẽ được yêu cầu nhập địa chỉ email và đồng ý với các điều khoản dịch vụ. Sau khi thực hiện, bạn sẽ thấy một thông báo cho biết quá trình đã thành công và nơi các chứng chỉ của bạn được lưu trữ:
Output
IMPORTANT NOTES:
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem
Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem
This certificate expires on 2022-06-01.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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>
Các chứng chỉ của bạn đã được tải xuống, cài đặt và tải lên, và cấu hình Nginx của bạn giờ đây sẽ tự động chuyển hướng tất cả các yêu cầu web sang https://. Hãy thử tải lại trang web của bạn và chú ý đến chỉ báo bảo mật của trình duyệt. Nó sẽ cho biết rằng trang web được bảo mật đúng cách, thường là với biểu tượng khóa 🔒. Nếu bạn kiểm tra máy chủ của mình bằng SSL Labs Server Test, nó sẽ nhận được điểm A.
Cuối cùng, hãy kiểm tra quá trình gia hạn.
Bước 5: Xác minh tính năng tự động gia hạn của Certbot
Các chứng chỉ của Let’s Encrypt chỉ có hiệu lực trong chín mươi ngày. Điều này nhằm khuyến khích người dùng tự động hóa quá trình gia hạn chứng chỉ của họ. Gói certbot
mà chúng ta đã cài đặt sẽ xử lý việc này cho chúng ta bằng cách thêm một bộ hẹn giờ systemd sẽ chạy hai lần một ngày và tự động gia hạn bất kỳ chứng chỉ nào còn hạn trong vòng ba mươi ngày.
Bạn có thể kiểm tra trạng thái của bộ hẹn giờ bằng lệnh systemctl
:
sudo systemctl status snap.certbot.renew.service
Output
○ snap.certbot.renew.service - Service for snap application certbot.renew
Loaded: loaded (/etc/systemd/system/snap.certbot.renew.service; static)
Active: inactive (dead)
TriggeredBy: ● snap.certbot.renew.timer
Để kiểm tra quá trình gia hạn, bạn có thể thực hiện chạy thử với certbot
sudo certbot renew --dry-run
Nếu bạn không thấy lỗi nào, mọi thứ đã sẵn sàng. Khi cần thiết, Certbot sẽ gia hạn chứng chỉ của bạn và tải lại Nginx để áp dụng các thay đổi. Nếu quá trình gia hạn tự động không thành công, Let’s Encrypt sẽ gửi tin nhắn đến email bạn đã chỉ định, cảnh báo bạn khi chứng chỉ của bạn sắp hết hạn.
Kết luận
Trong hướng dẫn này, bạn đã cài đặt công cụ Let’s Encrypt Certbot, tải xuống chứng chỉ SSL cho tên miền của mình, 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 có thêm câu hỏi về cách sử dụng Certbot, hãy tham khảo thêm tài liệu chính thức để hiểu rõ hơn.