---
title: "Cách bảo mật Nginx với Let's Encrypt trên Ubuntu 20.04"
description: "Cách bảo mật Nginx với Let's Encrypt trên Ubuntu 20.04"
url: https://cloudfly.vn/techblog/cach-bao-mat-nginx-voi-lets-encrypt-tren-ubuntu-2004
image: https://media.cloudfly.vn/posts/cach-bao-mat-Nginx-voi-Lets-Encrypt-tren-Ubuntu-20.04.png
---

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

## Giới thiệu

Let's Encrypt là Tổ chức phát hành chứng chỉ (Certificate Authority - CA) cung cấp một cách dễ dàng để lấy và cài đặt chứng chỉ TLS/SSL miễn phí, từ đó kích hoạt HTTPS được mã hóa trên các máy chủ web. Nó đơn giản hóa quy trình bằng cách cung cấp ứng dụng software 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ỉ 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 để lấy chứng chỉ SSL miễn phí cho Nginx trên Ubuntu 20.04 và thiết lập chứng chỉ của bạn để tự động gia hạn.

Hướng dẫn này sẽ sử dụng tệp cấu hình máy chủ Nginx riêng 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 máy chủ Nginx mới cho mỗi miền vì 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 này, bạn sẽ cần:

* Một máy chủ Ubuntu 20.04 được thiết lập bằng cách làm theo thiết lập máy chủ ban đầu này cho hướng dẫn Ubuntu 20.04, bao gồm sudo-enabled non-**root** user và 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 một tên miền từ CloudFly, 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 dưới đây được thiết lập cho máy chủ của bạn. 
1. 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.
2. Bản ghi A có `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 bằng cách làm theo Cách cài đặt Nginx trên Ubuntu 20.04. Đảm bảo rằng bạn có server block cho 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

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.

Cài đặt Certbot và đó là Nginx plugin với `apt`:
```command
sudo apt install certbot python3-certbot-nginx
```

Certbot hiện đã sẵn sàng để sử dụng, nhưng để nó tự động cấu hình SSL cho Nginx, chúng ta 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 đúng `server` block trong cấu hình Nginx của bạn để có thể tự động thiết lập 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 lệnh `server_name` phù hợp với tên miền mà bạn yêu cầu chứng chỉ.

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

Để kiểm tra, hãy mở tệp cấu hình cho 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:
```command
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:
```nginx
[label /etc/nginx/sites-available/example.com]
...
server_name <^>example.com<^> www.<^>example.com<^>;
...
```

Nếu đúng như vậy, hãy thoát khỏi trình chỉnh sửa của bạn và chuyển sang bước tiếp theo.

Nếu không, hãy cập nhật nó cho phù hợp. Sau đó, lưu tệp, thoát trình chỉnh sửa của bạn và xác minh cú pháp chỉnh sửa cấu hình của bạn:
```command
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 ký tự bị thiếu nào không. Khi cú pháp của tệp cấu hình của bạn là chính xác, hãy tải lại Nginx để tải cấu hình mới:
```command
sudo systemctl reload nginx
```

Certbot hiện có thể tìm đúng server block và tự động cập nhật khối đó.

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`, theo đề xuất của 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 cấu hình 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:
```command
sudo ufw status
```

Nó có thể trông như thế này, nghĩa là chỉ có lưu lượng HTTP được phép vào máy chủ web:
```
[secondary_label 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, để cho phép lưu lượng HTTPS, hãy cho phép cấu hình Nginx Full và xóa phụ cấp cấu hình Nginx HTTP dư thừa:
```command
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:
```command
sudo ufw status
```

```
[secondary_label 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 — Lấy chứng chỉ SSL

Certbot cung cấp nhiều cách khác nhau để lấy chứng chỉ SSL thông qua plugin. Nginx plugin sẽ đảm nhiệm việc thiết lập cấu hình lại Nginx và tải lại cấu hình bất cứ khi nào cần thiết. Để sử dụng plugin này, gõ như sau:
```command
sudo certbot --nginx -d <^>example.com<^> -d <^>www.example.com<^>
```

Điều 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ỉ 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 thành công, `certbot` sẽ hỏi bạn muốn thiết lập cấu hình cài đặt HTTPS của mình như thế nào.
```
[secondary_label 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 rồi nhấn `ENTER`. Cấu hình sẽ được cập nhật và Nginx sẽ tải lại để nhận cài đặt mới. `certbot` sẽ kết thúc bằng một thông báo cho bạn biết quy trình đã thành công và nơi lưu trữ chứng chỉ của bạn:
```
[secondary_label 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 2020-08-18. 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 xuống, cài đặt và tải. Hãy thử tải lại trang web của bạn bằng `https://` và chú ý đến chỉ báo bảo mật của trình duyệt. Nó sẽ chỉ ra rằng trang web được bảo mật đúng cách, thường có 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, thì máy chủ đó sẽ đạt điểm **A**.

Hãy kết thúc bằng cách kiểm tra quá trình đổi mới.

## Bước 5 — Xác minh tính năng tự động gia hạn của Certbot

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 quy trình gia hạn chứng chỉ của họ. Gói `certbot` mà chúng ta đã cài đặt sẽ giải quyết vấn đề này cho chúng ta bằng cách thêm systemd timer sẽ chạy hai lần một ngày và tự động gia hạn bất kỳ chứng chỉ nào trong vòng ba mươi ngày kể từ ngày hết hạn.

Bạn có thể truy vấn trạng thái của bộ hẹn giờ bằng `systemctl`:
```command
sudo systemctl status certbot.timer
```

```
[secondary_label Output]
● certbot.timer - Run certbot twice daily
     Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Mon 2020-05-04 20:04:36 UTC; 2 weeks 1 days ago
    Trigger: Thu 2020-05-21 05:22:32 UTC; 9h left
   Triggers: ● certbot.service
```

Để kiểm tra quy trình gia hạn, bạn có thể chạy thử với `certbot`:
```command
sudo certbot renew --dry-run
```

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