---
title: "Cách bảo mật Apache bằng Let's Encrypt trên Ubuntu 18.04"
description: "Cách bảo mật Apache bằng Let's Encrypt trên Ubuntu 18.04"
url: https://cloudfly.vn/techblog/cach-bao-mat-apache-bang-lets-encrypt-tren-ubuntu-1804
image: https://media.cloudfly.vn/posts/techblog_fCDo8SA.jpg
---

# Cách bảo mật Apache bằng Let's Encrypt trên Ubuntu 18.04

## Giới thiệu

Let's Encrypt là Cơ quan cấp chứng chỉ (Certificate Authority - CA) cung cấp cách lấy và cài đặt chứng chỉ TLS/SSL miễn phí, từ đó cho phép HTTPS được mã hóa trên máy chủ web. Nó hợp lý hóa quy trình bằng cách cung cấp một software client (phần mềm máy 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 Apache trên Ubuntu 18.04 và xác minh rằng chứng chỉ của bạn được thiết lập để tự động gia hạn.

Hướng dẫn này sử dụng tệp máy chủ ảo Apache riêng thay vì tệp cấu hình mặc định để thiết lập trang web sẽ được bảo mật bằng Let's Encrypt. Chúng tôi khuyên bạn nên tạo các tệp máy chủ ảo Apache mới cho từng miền được lưu trữ trên một máy chủ vì việc này 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 thiết lập dự phòng.

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

Để hoàn thành hướng dẫn này, bạn sẽ cần:

* Một máy chủ Ubuntu 18.04 được thiết lập bằng cách làm theo hướng dẫn thiết lập máy chủ ban đầu này cho Ubuntu 18.04, bao gồm sudo non-root user và tường lửa.
* Một tên miền được đăng ký đầy đủ. Hướng dẫn này sẽ sử dụng **your_domain** làm ví dụ xuyên suốt. Bạn có thể mua tên miền tại CloudFly, 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 đây đều được thiết lập cho máy chủ của bạn.
  - Bản ghi A có `<^>your_domain<^>` trỏ đến địa chỉ IP công cộng của máy chủ của bạn.
  - Bản ghi A có `www.<^>your_domain<^>` trỏ đến địa chỉ IP công cộng của máy chủ của bạn.

* Apache được cài đặt bằng cách làm theo Cách cài đặt Apache trên Ubuntu 18.04. Hãy đảm bảo rằng bạn có tệp máy chủ ảo cho miền của mình. Hướng dẫn này sẽ sử dụng `/etc/apache2/sites-available/<^>your_domain<^>.conf` làm ví dụ.

# Bước 1 - Cài đặt Certbot

Để có được chứng chỉ SSL với Let's Encrypt, bạn cần cài đặt phần mềm Certbot trên máy chủ của mình. Đối với hướng dẫn này, chúng tôi sẽ sử dụng kho lưu trữ Ubuntu package mặc định để cài đặt Certbot.

Chạy lệnh sau để cài đặt hai gói: `certbot` và `python3-certbot-apache`. Cái sau là một plugin tích hợp Certbot với Apache, để có thể tự động lấy chứng chỉ và định cấu hình HTTPS trong máy chủ web của bạn chỉ bằng một lệnh:
```command
sudo apt install certbot python3-certbot-apache
```

Xác nhận cài đặt bằng cách nhấn `Y` rồi `ENTER` để chấp nhận.

Certbot hiện đã được cài đặt trên máy chủ của bạn. Tiếp theo, bạn sẽ xác minh cấu hình của Apache để đảm bảo máy chủ ảo của bạn được đặt phù hợp. Điều này đảm bảo rằng tập lệnh máy khách `certbot` sẽ có thể phát hiện miền của bạn và định cấu hình lại máy chủ web của bạn để tự động sử dụng chứng chỉ SSL mới được tạo.

## Bước 2 - Kiểm tra cấu hình máy chủ ảo Apache của bạn

Để tự động lấy và định cấu hình SSL cho máy chủ web của bạn, Certbot cần có khả năng định vị đúng máy chủ ảo trong tệp cấu hình Apache của bạn. (Các) tên miền máy chủ của bạn sẽ được truy xuất từ các lệnh `ServerName` và `ServerAlias` được xác định trong khối cấu hình Virtualhost của bạn.

Nếu bạn đã làm theo bước thiết lập máy chủ ảo trong hướng dẫn cài đặt Apache, bạn sẽ có khối VirtualHost (VirtualHost block) cho miền của mình tại `/etc/apache2/sites-available/<^>your_domain<^>.conf` với lệnh `ServerName` đã được đặt thích hợp.

Để kiểm tra, hãy mở tệp máy chủ ảo 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/apache2/sites-available/<^>your_domain<^>.conf
```

Tìm dòng `ServerName` và `ServerAlias` hiện có:
```nginx
[label /etc/apache2/sites-available/your_domain.conf]
...
ServerName <^>your_domain<^>;
SeverAlias <^>www.your_domain<^>
...
```

Nếu `ServerName` và `ServerAlias` của bạn đã được thiết lập thì bạn có thể thoát khỏi trình soạn thảo văn bản và chuyển sang bước tiếp theo. Nếu bạn đang sử dụng `nano`, bạn có thể thực hiện việc này bằng cách nhấn `CTRL + X` rồi `Y` và `ENTER`.

Nếu cấu hình máy chủ ảo hiện tại của bạn không khớp, hãy cập nhật nó cho phù hợp. Sau đó, lưu và thoát khỏi trình soạn thảo văn bản. Tiếp theo, xác thực các thay đổi của bạn:
```command
sudo apache2ctl configtest
```

Nếu không có bất kỳ lỗi nào với cú pháp của tệp máy chủ ảo, bạn sẽ nhận được phản hồi `Syntax OK`. Nếu bạn gặp lỗi, hãy mở lại tệp máy chủ ảo 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 của tệp cấu hình của bạn đúng, hãy tải lại Apache để tải cấu hình mới:
```command
sudo systemctl reload apache2
```

Với những thay đổi này có hiệu lực, Certbot sẽ có thể tìm thấy khối Virtualhost chính xác và cập nhật nó.

Tiếp theo, bạn sẽ 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ư được khuyến nghị trong các hướng dẫ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. Apache đăng ký một số cấu hình ứng dụng UFW và bạn có thể tận dụng cấu hình **Apache Full** để cho phép cả lưu lượng HTTP và HTTPS trên máy chủ của mình.

Xác minh loại lưu lượng truy cập hiện được phép trên máy chủ của bạn bằng cách chạy như sau:
```command
sudo ufw status
```

Nếu bạn làm theo một trong các hướng dẫn cài đặt Apache của chúng tôi, đầu ra của bạn sẽ tạo ra kết quả như sau, điều này có nghĩa là chỉ cho phép lưu lượng HTTP trên cổng `80`:
```
[secondary_label Output]
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
<^>Apache                     ALLOW       Anywhere<^>                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
<^>Apache (v6)                ALLOW       Anywhere (v6)<^>
```

Ngoài ra, để cho phép lưu lượng HTTPS, hãy cho phép cấu hình `Apache Full`:
```command
sudo ufw allow 'Apache Full'
```

Sau đó, xóa dự phòng cấu hình `Apache` dư thừa:
```command
sudo ufw delete allow 'Apache'
```

Kiểm tra lại trạng thái:
```command
sudo ufw status
```

Bạn sẽ nhận được kết quả đầu ra sau:
```
[secondary_label Output]
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
<^>Apache Full                ALLOW       Anywhere<^>                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
<^>Apache Full (v6)           ALLOW       Anywhere (v6)<^>  
```

Bây giờ bạn đã sẵn sàng chạy Certbot và nhận chứng chỉ của mình.

## 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. Plugin Apache sẽ đảm nhiệm việc cấu hình lại Apache 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, hãy chạy như sau:
```command
sudo certbot --apache
```

Lệnh này sẽ tạo lời nhắc kèm theo một loạt câu hỏi để định cấu hình chứng chỉ SSL của bạn. Trước tiên, bạn sẽ được yêu cầu cung cấp địa chỉ email hợp lệ, địa chỉ này nhằm mục đích thông báo gia hạn và thông báo bảo mật:
```
[secondary_label Output]
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): <^>you@your_domain<^>
```

Sau khi bạn đã cung cấp địa chỉ email hợp lệ, hãy nhấn `ENTER` và chuyển sang bước tiếp theo. Bạn sẽ được yêu cầu xác nhận xem bạn có đồng ý với điều khoản dịch vụ của Let's Encrypt hay không. Xác nhận bằng cách nhấn `A` và `ENTER`:
```
[secondary_label Output]
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: <^>A<^>
```

Tiếp theo, bạn sẽ được hỏi liệu bạn có muốn chia sẻ email của mình với Electronic Frontier Foundation để nhận tin tức và thông tin khác hay không. Nếu không muốn đăng ký thì nhấn `N`, nếu không thì nhấn `Y` rồi `ENTER` để chuyển sang bước tiếp theo:
```
[secondary_label Output]
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: <^>N<^>
```

Lời nhắc sẽ thông báo cho Certbot về những miền bạn muốn kích hoạt HTTPS. Danh sách tên miền được tự động lấy từ cấu hình máy chủ ảo Apache của bạn. Đây là lý do tại sao điều quan trọng là phải xác nhận rằng bạn đã định cấu hình đúng cài đặt `ServerName` và `ServerAlias` trong máy chủ ảo của mình. Nếu bạn muốn bật HTTPS cho tất cả các tên miền được liệt kê (được khuyến nghị), hãy để trống lời nhắc và nhấn `ENTER` để tiếp tục. Nếu không, hãy chọn miền bạn muốn bật HTTPS bằng cách liệt kê từng số thích hợp, phân tách bằng dấu phẩy và/hoặc dấu cách, sau đó nhấn `ENTER`:
```
[secondary_label Output]
Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: <^>your_domain<^>
2: <^>your_domain<^>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):
```

Bạn sẽ nhận được kết quả đầu ra sau:
```
[secondary_label Output]
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for <^>your_domain<^>
http-01 challenge for <^>your_domain<^>
Enabled Apache rewrite module
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/apache2/sites-available/<^>your_domain<^>-le-ssl.conf
Enabled Apache socache_shmcb module
Enabled Apache ssl module
Deploying Certificate to VirtualHost /etc/apache2/sites-available/<^>your_domain<^>-le-ssl.conf
Enabling available site: /etc/apache2/sites-available/<^>your_domain<^>-le-ssl.conf
Deploying Certificate to VirtualHost /etc/apache2/sites-available/<^>your_domain<^>-le-ssl.conf
```

Tiếp theo, bạn sẽ được yêu cầu chọn xem bạn có muốn lưu lượng truy cập HTTP được chuyển hướng đến HTTPS hay không. Điều này có nghĩa là khi ai đó truy cập trang web của bạn thông qua các kênh không được mã hóa (HTTP), họ sẽ tự động được chuyển hướng đến địa chỉ HTTPS của trang web của bạn. Chọn `2` để bật chuyển hướng hoặc `1` nếu bạn muốn giữ HTTP và HTTPS làm phương thức riêng biệt để truy cập trang web của mình:
```
[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): <^>2<^>
```

Sau khi nhập phản hồi của bạn, quá trình cấu hình của Certbot sẽ hoàn tất. Bạn sẽ nhận được nhận xét cuối cùng về chứng chỉ mới của mình, nơi tìm các tệp được tạo và cách kiểm tra cấu hình của bạn bằng công cụ bên ngoài để phân tích tính xác thực của chứng chỉ:
```
[secondary_label Output]
Congratulations! You have successfully enabled https://<^>your_domain<^>
and <^>your_domain<^>

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=<^>your_domain<^>
https://www.ssllabs.com/ssltest/analyze.html?d=<^>your_domain<^>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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 cert will expire on 2022-03-07. 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 vào cấu hình của Apache. 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ó phải chỉ ra rằng trang web được bảo mật đúng cách, thường có biểu tượng khóa trên thanh địa chỉ.

Bạn có thể sử dụng SSL Labs Server Test để xác minh cấp chứng chỉ của mình và nhận thông tin chi tiết về chứng chỉ đó từ góc độ của một dịch vụ bên ngoài.

Trong bước tiếp theo, bạn sẽ kiểm tra tính năng tự động gia hạn của Certbot, tính năng này đảm bảo chứng chỉ của bạn sẽ tự động gia hạn trước ngày hết hạn.

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

Chứng chỉ 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ọ và đảm bảo rằng các chứng chỉ bị sử dụng sai hoặc khóa bị đánh cắp sẽ sớm hết hạn.

Gói `certbot` bạn đã cài đặt đảm nhiệm việc gia hạn bằng cách thêm tập lệnh gia hạn vào `/etc/cron.d`, tập lệnh này được quản lý bởi dịch vụ `systemctl` có tên là `certbot.timer`. Tập lệnh này chạy hai lần một ngày và sẽ 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.

Kiểm tra trạng thái của dịch vụ này và đảm bảo rằng nó đang hoạt động và đang chạy:
```command
sudo systemctl status certbot.timer
```

Bạn sẽ nhận được kết quả tương tự như sau:
```
[secondary_label Output]
● certbot.timer - Run certbot twice daily
   Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: en
   Active: active (waiting) since Tue 2021-12-07 20:04:42 UTC; 1h 45min ago
  Trigger: Wed 2021-12-08 11:22:45 UTC; 13h left

Dec 07 20:04:42 encrypt systemd[1]: Started Run certbot twice daily.
```

Kiểm tra quy trình gia hạn bằng cách chạy thử với `certbot`:
```command
sudo certbot renew --dry-run
```

Nếu bạn không nhận được lỗi nào, 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 Apache để xử lý 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ô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 `certbot` máy khách Let's Encrypt, định cấu hình và cài đặt chứng chỉ SSL cho miền của mình, đồng thời xác nhận dịch vụ gia hạn chứng chỉ tự động của Certbot đang hoạt động trong `systemctl`. Nếu bạn có thêm câu hỏi về việc sử dụng Certbot, tài liệu của họ là nơi tốt để bắt đầu.
