Reading Time: 6 minutes

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.

Cách bảo mật Nginx với Let's Encrypt

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

  1. Cài đặt Certbot
  2. Xác nhận cấu hình của Nginx
  3. Mở cổng HTTPS trên tường lửa
  4. Lấy chứng chỉ SSL
  5. 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.
  • 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.

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất