Cách bảo mật Nginx với Let's Encrypt trên Ubuntu 18.04

1 năm trước

Một phiên bản trước của hướng dẫn này được viết bởi Hazel Virdó

Giới thiệu

Let's Encrypt là Tổ chức phát hành chứng chỉ (CA) cung cấp một cách dễ dàng để có được và cài đặt các chứng chỉ TLS / SSL miễn phí, qua đó cho phép mã hóa HTTPS trên các web server. Nó đơn giản hóa quá trình bằng cách cung cấp ứng dụng phần mềm khách, 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ỉ hoàn toàn tự động trên cả Apache và Nginx.

Trong hướng dẫn này, bạn sẽ sử dụng Certbot để nhận chứng chỉ SSL miễn phí cho Nginx trên Ubuntu 18.04 và thiết lập chứng chỉ để tự động gia hạn.

Hướng dẫn này sẽ sử dụng một tệp khối server 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 khối server Nginx mới cho mỗi miền giúp tránh các lỗi phổ biến và duy trì các tệp mặc định dưới dạng cấu hình dự phòng.

 

Điều kiện tiên quyết

Để làm theo hướng dẫn, bạn cần:

  • Một Ubuntu 18.04 server gồm một sudo non-root user và một firewall.

  • Một tên miền được đăng ký đầy đủ. Hướng dẫn này sẽ sử dụng example.com. Bạn có thể mua tên miền trên Namecheap, nhận tên miền miễn phí trên Freenom hoặc sử dụng công ty đăng ký tên miền mà bạn chọn.

  • Cả hai bản ghi DNS sau được thiết lập cho server của bạn.

    • Bản ghi A với example.com trỏ vào địa chỉ IP công cộng của server của bạn.
    • Bản ghi A với www.example.com  trỏ vào địa chỉ IP của server của bạn.
  • Hãy chắc chắn có một khối server cho tên miền của bạn. 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

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 server của bạn.

Certbot đang phát triển rất tích cực, vì vậy các gói Certbot được cung cấp bởi Ubuntu có xu hướng lỗi thời. Tuy nhiên, các nhà phát triển Certbot duy trì một kho phần mềm Ubuntu với các phiên bản cập nhật, vì vậy chúng ta sẽ sử dụng kho lưu trữ đó thay thế.

Đầu tiên, thêm kho lưu trữ:

sudo add-apt-repository ppa:certbot/certbot 

Bạn cần nhấn ENTER để chấp nhận. Sau đó, cập nhật danh sách gói để nhận thông tin gói của kho lưu trữ mới:

sudo apt update 

Và cuối cùng, cài đặt gói Nginx của Certbot với apt:

sudo apt install python-certbot-nginx 

Certbot đã sẵn sàng để sử dụng, nhưng để cấu hình SSL cho Nginx, cần xác minh một số cấu hình của Nginx.

 

Bước 2 — Xác nhận cấu hình của Nginx

Certbot cần có khả năng tìm ra khối  server chính xác trong cấu hình Nginx để nó có thể tự động định cấu hình SSL. Cụ thể, nó thực hiện điều này bằng cách tìm kiếm một chỉ thị server_name khớp với tên miền mà bạn yêu cầu chứng chỉ.

Nếu đã làm theo bước thiết lập khối server trong hướng dẫn cài đặt Nginx, bạn sẽ có một khối server cho miền tại /etc/nginx/sites-available/example.com với chỉ thị server_name đã được thiết lập một cách thích hợp.

Để kiểm tra, hãy mở tệp chặn server cho miền của bạn bằng nano hoặc trình chỉnh sửa 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ẽ giống như thế này:

/etc/nginx/sites-available/example.com
...server_nameexample.com www.example.com;
...

Nếu có, 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 để khớp. Sau đó lưu tệp, thoát khỏi trình chỉnh sửa và xác minh cú pháp của các chỉnh sửa cấu hình:

sudo nginx -t 

Nếu gặp lỗi, hãy mở lại tệp chặn server và kiểm tra mọi lỗi chính tả hoặc ký tự bị thiếu. Khi cú pháp của tệp cấu hình chính xác, hãy tải lại Nginx để tải cấu hình mới:

sudo systemctl reload nginx 

Certbot bây giờ có thể tìm thấy khối server chính xác và cập nhật nó.

Tiếp theo, hãy cập nhật firewall để cho phép HTTPS traffic.

 

Bước 3  — Cho phép HTTPS thông qua Firewall

Nếu đã bật firewall ufw, như được hướng dẫn ở điều kiện tiên quyết, bạn cần phải điều chỉnh cài đặt để cho phép HTTPS traffic. 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 nhập:

sudo ufw status 

Nó có thể giống như thế này, có nghĩa là chỉ HTTP traffic được phép cho web server:

Output
Status: active 
To Action From
-- ------ ---- 
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere 
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6) 

Ngoài ra, hãy cho phép HTTPS traffic, cho phép hồ sơ Nginx đầy đủ và xóa phụ cấp hồ sơ Nginx HTTP dư thừa:

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ỉ.

 

Bước 4 — Nhận chứng chỉ SSL

Certbot cung cấp nhiều cách để có được chứng chỉ SSL thông qua các plugin. Plugin Nginx sẽ xử lý 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, hãy nhập như sau:

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

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

Nếu đây là lần đầu 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ẽ liên lạc với server Let's Encrypt, sau đó chạy thử thách để xác minh bạn kiểm soát miền đang yêu cầu chứng chỉ.

Nế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 or not to redirect HTTP traffic to HTTPS, removing HTTP access.
------------------------------------------------------------------------------- 
1: No redirect - Make no further changes to the webserver configuration. 
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this 
change by editing your web server's configuration.
------------------------------------------------------------------------------- 
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 

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

Output
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 2018-07-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 

Chứng chỉ được tải xuống, cài đặt và tải. Thử tải lại trang web bằng https:// và nhận thấy chỉ báo bảo mật của trình duyệt. Nó sẽ chỉ ra trang web được bảo mật đúng cách, thường là với một biểu tượng khóa màu xanh lục. Nếu bạn kiểm tra server bằng cách sử dụng SSL Labs Server Test, nó sẽ nhận được điểm A.

Hãy kết thúc bằng cách kiểm tra quá trình gia hạn.

 

Bước 5 — Xác minh tự động gia hạn Certbot

Chứng chỉ Let's Encrypt chỉ hợp lệ trong 90 ngày. Điều này khuyến khích user tự động quá trình gia hạn chứng chỉ của họ. Gói certbot đã cài đặt sẽ đảm nhiệm việc này bằng cách thêm tập lệnh gia hạn vào /etc/cron.d. Tập lệnh này chạy 2 lần/1 ngày và sẽ tự động gia hạn bất kỳ chứng chỉ nào trong vòng 30 ngày kể từ ngày hết hạn.

Để kiểm tra quy trình gia hạn, bạn có thể chạy khô với certbot:

sudo certbot renew --dry-run 

Nếu không thấy lỗi, bạn đã hoàn tất. Khi cần thiết, Certbot sẽ gia hạn chứng chỉ của bạn và tải lại Nginx để nhận 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 thư đến email đã chỉ định, cảnh báo 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 certbot Let's Encrypt máy khách, các chứng chỉ SSL đã tải xuống cho miền của bạn, cấu hình Nginx để sử dụng các chứng chỉ này và thiết lập gia hạn chứng chỉ tự động. Nếu có thêm câu hỏi về việc sử dụng Certbot, tài liệu này là một nơi tốt để bắt đầu.