Table of Contents

No table of contents

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

Posted on: 25 tháng 4 năm 2023

Giới thiệu

Let's Encrypt là Tổ chức phát hành chứng chỉ (Certificate Authority - CA) hỗ trợ 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 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 khách phần mềm, 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, chúng tôi sẽ sử dụng Certbot để lấy chứng chỉ SSL miễn phí cho Apache trên Ubuntu 20.04 và đảm bảo rằng chứng chỉ này được thiết lập để tự động gia hạn.

Hướng dẫn này sử dụng một tệp máy chủ ảo riêng biệt thay vì tệp cấu hình mặc định của Apache để thiết lập trang web sẽ được bảo mật bởi 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 mỗi miền được lưu trữ trong một máy chủ vì nó giúp tránh các lỗi phổ biến và duy trì các tệp cấu hình mặc định làm thiết lập 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 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.
  • Cả hai bản ghi DNS sau được thiết lập cho máy chủ của bạn.
  1. Một bản ghi A với your_domain trỏ đến địa chỉ IP công cộng của máy chủ của bạn.
  2. Một bản ghi A với 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 20.04. Đả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, trước tiên chúng tôi cần cài đặt phần mềm Certbot trên máy chủ của bạn. Chúng tôi sẽ sử dụng kho lưu trữ gói Ubuntu mặc định cho điều đó.

Chúng tôi cần hai gói: certbotpython3-certbot-apache. Cái sau là một plugin tích hợp Certbot với Apache, giúp tự động lấy chứng chỉ và định cấu hình HTTPS trong máy chủ web của bạn bằng một lệnh duy nhất.

  1. sudo apt install certbot python3-certbot-apache

Bạn sẽ được nhắc xác nhận cài đặt bằng cách nhấn Y, sau đó ENTER.

Certbot hiện đã được cài đặt trên máy chủ của bạn. Trong bước tiếp theo, chúng tôi 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 sẽ đảm bảo rằng tập lệnh máy khách certbot sẽ có thể phát hiện các 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

Để có thể tự động lấy và định cấu hình SSL cho máy chủ web của bạn, Certbot cần tìm đúng máy chủ ảo trong các 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 ServerNameServerAlias đượ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, thì bạn nên thiết lập một khối VirtualHost cho miền của mình tại /etc/apache2/sites-available/your_domain.conf với ServerName và cả các lệnh ServerAlias đã được đặt thích hợp.

Để kiểm tra điều này, hãy mở tệp máy chủ ảo cho miền của bạn bằng cách sử dụng nano hoặc trình soạn thảo văn bản ưa thích của bạn:

  1. sudo nano /etc/apache2/sites-available/your_domain.conf

Tìm các dòng ServerNameServerAlias hiện có. Chúng sẽ trông như thế này:

/etc/apache2/sites-available/your_domain.conf
...
ServerName your_domain
ServerAlias www.your_domain
...

Nếu bạn đã thiết lập ServerNameServerAlias như thế này, 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 đang sử dụng nano, bạn có thể thoát bằng cách nhập CTRL+X, sau đó YENTER để xác nhận.

Nếu cấu hình máy chủ ảo hiện tại của bạn không khớp với ví dụ, hãy cập nhật nó cho phù hợp. Khi bạn hoàn tất, hãy lưu tệp và thoát khỏi trình chỉnh sửa. Sau đó, chạy lệnh sau để xác thực các thay đổi của bạn:

  1. sudo apache2ctl configtest

Bạn sẽ nhận được Syntax OK dưới dạng phản hồi. 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 đánh máy 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 là chính xác, hãy tải lại Apache để các thay đổi có hiệu lực:

  1. sudo systemctl reload apache2

Với những thay đổi này, Certbot sẽ có thể tìm đúng khối VirtualHost và cập nhật nó.

Tiếp theo, chúng tôi 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, theo đề xuất của hướng dẫn điều kiện tiên quyết, thì bạn sẽ cần điều chỉnh cài đặt để cho phép lưu lượng HTTPS. Sau khi cài đặt, Apache đăng ký một vài cấu hình ứng dụng UFW khác nhau. Chúng tôi 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 bạn.

Để xác minh loại lưu lượng nào hiện được phép trên máy chủ của bạn, bạn có thể sử dụng:

  1. 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ẽ giống như thế này, nghĩa là hiện tại chỉ cho phép lưu lượng HTTP trên cổng 80:

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 truy cập HTTPS, hãy bật cấu hình “Apache Full” và xóa cấu hình “Apache” dư thừa:

  1. sudo ufw allow 'Apache Full'
  2. sudo ufw delete allow 'Apache'

Trạng thái của bạn bây giờ sẽ trông như thế này:

  1. sudo ufw status
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à lấy 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 nhận 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, gõ như sau:

  1. sudo certbot --apache

Tập lệnh này sẽ nhắc bạn trả lời một loạt câu hỏi để định cấu hình chứng chỉ SSL của bạn. Đầu tiên, nó sẽ hỏi bạn một địa chỉ e-mail hợp lệ. Email này sẽ được sử dụng cho các thông báo gia hạn và thông báo bảo mật:

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 cung cấp địa chỉ e-mail hợp lệ, nhấn ENTER để chuyển sang bước tiếp theo. Sau đó, bạn sẽ được nhắc xác nhận nếu bạn đồng ý với các điều khoản dịch vụ của Let's Encrypt. Bạn có thể xác nhận bằng cách nhấn A rồi ENTER:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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 bạn không muốn đăng ký nội dung của họ, hãy nhập N. Nếu không, hãy nhập Y. Sau đó, nhấn ENTER để chuyển sang bước tiếp theo.

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

Bước tiếp theo sẽ nhắc bạn thông báo cho Certbot về những miền mà bạn muốn kích hoạt HTTPS. Các tên miền được liệt kê được tự động lấy từ cấu hình máy chủ ảo Apache của bạn, đó là lý do tại sao điều quan trọng là phải đảm bảo rằng bạn có các cài đặt ServerNameServerAlias chính xác được định cấu hình 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ị), bạn có thể để trống lời nhắc và nhấn ENTE để tiếp tục. Nếu không, hãy chọn các miền bạn muốn bật HTTPS bằng cách liệt kê từng số thích hợp, được phân tách bằng dấu phẩy và/hoặc dấu cách, sau đó nhấn ENTER.

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: your_domain
2: www.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ẽ thấy đầu ra như thế này:

Obtaining a new certificate
Performing the following challenges:
http-01 challenge for your_domain
http-01 challenge for www.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 nhắc chọn có muốn chuyển hướng lưu lượng HTTP sang HTTPS hay không. Trên thực tế, điều đó 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ữ cả HTTP và HTTPS làm các phương thức truy cập trang web riêng biệt.

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 bước này, cấu hình của Certbot đã hoàn tất và bạn sẽ được cung cấp những nhận xét cuối cùng về chứng chỉ mới của mình, nơi xác định vị trí 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ỉ của bạn:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://your_domain and
https://www.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=www.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 2020-07-27. 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ủa bạn hiện đã được 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ó sẽ chỉ ra rằng trang web của bạn được bảo mật đúng cách, thường bằng cách thêm biểu tượng khóa vào thanh địa chỉ.

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

Trong bước tiếp theo và cũng là bước cuối cùng, chúng tôi 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 rằng chứng chỉ của bạn sẽ được 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ỉ 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ọ, cũng như để đảm bảo rằng các chứng chỉ bị sử dụng sai mục đích hoặc khóa bị đánh cắp sẽ hết hạn sớm hơn.

Gói certbot mà chúng tôi đã cài đặt đảm nhận việc gia hạn bằng cách đưa tập lệnh gia hạn vào /etc/cron.d, đượ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, bạn có thể sử dụng:

  1. sudo systemctl status certbot.timer

Bạn sẽ nhận được đầu ra tương tự như sau:

Output
● certbot.timer - Run certbot twice daily Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled) Active: active (waiting) since Tue 2020-04-28 17:57:48 UTC; 17h ago Trigger: Wed 2020-04-29 23:50:31 UTC; 12h left Triggers: ● certbot.service Apr 28 17:57:48 fine-turtle systemd[1]: Started Run certbot twice daily.

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

  1. 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 Apache để 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 certbot ứng dụng 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 rằng dịch vụ gia hạn 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à một nơi tốt để bắt đầu.

0 replies