Let’s Encrypt là một Tổ Chức Cấp Chứng Chỉ (Certificate Authority – CA) hỗ trợ việc lấy và cài đặt chứng chỉ TLS/SSL miễn phí, qua đó kích hoạt kết nối HTTPS được mã hóa trên các máy chủ web. Quá trình này được đơn giản hóa nhờ công cụ Certbot, có khả năng tự động hóa hầu hết (nếu không muốn nói là tất cả) các bước cần thiết. Hiện tại, toàn bộ quy trình lấy và cài đặt chứng chỉ có thể được tự động hóa hoàn toàn trên cả Apache và Nginx.
Trong hướng dẫn này, chúng ta 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 chứng chỉ này được thiết lập để tự động gia hạn.
Bài hướng dẫn này sử dụng một file virtual host riêng, thay vì file 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 khích tạo mới các file virtual host Apache cho mỗi tên miền được lưu trữ trên máy chủ, vì điều này giúp tránh các lỗi phổ biến và giữ lại các file cấu hình mặc định như một phương án dự phòng.
Triển khai ứng dụng frontend của bạn từ GitHub bằng DataOnline App Platform. Hãy để DataOnline lo việc mở rộng ứng dụng của bạn.
Yêu cầu tiên quyết
Để theo dõi bài hướng dẫn này, bạn cần:
- Một máy chủ Ubuntu 20.04 đã được thiết lập theo hướng dẫn Cài đặt máy chủ ban đầu cho Ubuntu 20.04, bao gồm một người dùng không phải root có quyền sudo và đã bật firewall.
- Một tên miền đã được đăng ký đầy đủ. Bài hướng dẫn này sử dụng your_domain làm ví dụ. Bạn có thể mua tên miền tại Namecheap, lấy miễn phí ở Freenom, hoặc sử dụng nhà đăng ký tên miền tùy chọn.
- Đã cấu hình hai bản ghi DNS sau cho máy chủ. Bạn có thể tham khảo bài viết Giới thiệu về DNS của DataOnline để biết cách thêm chúng:
- Bản ghi A trỏ your_domain đến địa chỉ IP công cộng của máy chủ.
- Bản ghi A trỏ www.your_domain đến địa chỉ IP công cộng của máy chủ.
- Đã cài đặt Apache theo hướng dẫn Cách Cài Đặt Apache trên Ubuntu 20.04. Hãy chắc chắn bạn có một file virtual host cho tên miền. Bài 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
Để lấy chứng chỉ SSL từ Let’s Encrypt, trước hết ta cần cài đặt phần mềm Certbot trên máy chủ. Ta sẽ dùng kho gói mặc định của Ubuntu cho việc này.
Ta cần hai gói: certbot
và python3-certbot-apache
. Gói thứ hai là plugin tích hợp Certbot với Apache, cho phép tự động lấy chứng chỉ và cấu hình HTTPS trên máy chủ web chỉ với một lệnh duy nhất.
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
, rồi nhấn ENTER
.
Giờ đây, Certbot đã được cài đặt trên máy chủ của bạn. Ở bước tiếp theo, chúng ta sẽ kiểm tra cấu hình Apache để chắc chắn virtual host đã được thiết lập đúng. Việc này giúp script client của Certbot tự động phát hiện các tên miền và tái cấu hình máy chủ web để dùng chứng chỉ SSL mới một cách tự động.
Bước 2 – Kiểm tra cấu hình Virtual Host của Apache
Để tự động lấy và cấu hình SSL cho máy chủ web, Certbot cần tìm được virtual host phù hợp trong các file cấu hình của Apache. Tên miền trên máy chủ sẽ được lấy từ các chỉ thị ServerName và ServerAlias được định nghĩa trong khối VirtualHost.
Nếu bạn đã làm theo bước thiết lập virtual host trong hướng dẫn cài đặt Apache, bạn sẽ có một khối VirtualHost cho tên miền tại /etc/apache2/sites-available/your_domain.conf
, với các chỉ thị ServerName và ServerAlias đã thiết lập phù hợp.
Mở file virtual host cho tên miền của bạn bằng nano hoặc trình soạn thảo ưa thích:
sudo nano /etc/apache2/sites-available/your_domain.conf
Tìm dòng ServerName và ServerAlias. Chúng sẽ trông giống như sau:
/etc/apache2/sites-available/your_domain.conf ... ServerName your_domain ServerAlias www.your_domain ...
Nếu bạn đã thiết lập ServerName và ServerAlias như vậy, hãy thoát trình soạn thảo và chuyển sang bước tiếp theo. Nếu đang dùng nano, nhấn CTRL+X
, sau đó Y
và ENTER
để xác nhận.
Nếu cấu hình virtual host hiện tại của bạn không giống ví dụ trên, hãy cập nhật cho khớp. Sau đó, lưu file và thoát. Tiếp theo, chạy lệnh sau để xác nhận các thay đổi:
sudo apache2ctl configtest
Bạn sẽ nhận được thông báo Syntax OK nếu không có lỗi cú pháp. Nếu có lỗi, hãy mở lại file virtual host và kiểm tra xem có lỗi gõ hay thiếu ký tự nào không. Khi file cấu hình của bạn đã chính xác, hãy tải lại Apache để áp dụng thay đổi:
sudo systemctl reload apache2
Nhờ những thay đổi này, Certbot sẽ có thể tìm khối VirtualHost phù hợp và cập nhật nó. Tiếp theo, chúng ta sẽ cập nhật firewall để cho phép lưu lượng HTTPS.
Bước 3 – Cho phép HTTPS qua Firewall
Nếu bạn đã bật tường lửa UFW theo khuyến nghị ở các bài hướng dẫn yêu cầu ban đầu, bạn cần điều chỉnh để cho phép lưu lượng HTTPS. Khi cài đặt, Apache sẽ đăng ký một số hồ sơ ứng dụng UFW khác nhau. Ta có thể tận dụng hồ sơ “Apache Full” để cho phép cả HTTP và HTTPS trên máy chủ.
Để xem loại lưu lượng nào hiện đang được cho phép, dùng:
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, output có thể sẽ trông giống thế này, nghĩa là 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)
Để cho phép thêm lưu lượng HTTPS, hãy cho phép hồ sơ “Apache Full” và xóa hồ sơ “Apache” dư thừa:
sudo ufw allow 'Apache Full' sudo ufw delete allow 'Apache'
Kiểm tra lại:
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ỉ.
Bước 4 – Lấy chứng chỉ SSL
Certbot cung cấp nhiều cách để lấy chứng chỉ SSL thông qua các plugin. Plugin Apache sẽ lo việc tái cấu hình Apache và tải lại cấu hình khi cần. Để dùng plugin này, gõ lệnh:
sudo certbot --apache
Script này sẽ nhắc bạn trả lời một loạt câu hỏi để cấu hình chứng chỉ SSL. Đầu tiên, nó yêu cầu bạn nhập một địa chỉ email hợp lệ. Địa chỉ này sẽ được dùng để gửi thông báo về gia hạn và thông tin 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 nhập email hợp lệ, nhấn ENTER
để sang bước tiếp theo. Bạn sẽ được hỏi xác nhận việc đồng ý với điều khoản dịch vụ của Let’s Encrypt. Bạn có thể nhấn A
, rồi ENTER
để đồng ý:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 với Tổ chức Electronic Frontier Foundation (EFF) để nhận tin tức và các thông tin khác hay không. Nếu không muốn, hãy nhập N. Nếu đồng ý, nhập Y. Sau đó nhấn ENTER để tiếp tục.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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, bạn sẽ được nhắc để Certbot biết những tên miền nào bạn muốn kích hoạt HTTPS. Danh sách tên miền được lấy tự động từ cấu hình virtual host của Apache, do đó việc cấu hình đúng ServerName và ServerAlias là rất quan trọng. Nếu bạn muốn bật HTTPS cho tất cả tên miền đã liệt kê, hãy để trống và nhấn ENTER. Nếu chỉ muốn bật một vài tên miền, hãy nhập các số tương ứng, cách nhau bởi dấu phẩy hoặc dấu cách, rồi 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 output tương tự:
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
Kế tiếp, bạn sẽ được hỏi có muốn chuyển hướng (redirect) lưu lượng HTTP sang HTTPS hay không. Nếu chọn chuyển hướng, khi có ai đó truy cập website qua HTTP, họ sẽ tự động được chuyển sang HTTPS. Hãy chọn 2 để bật chuyển hướng, hoặc 1 nếu bạn muốn giữ cả hai cách truy cập HTTP và HTTPS:
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 Certbot hoàn tất và bạn sẽ thấy thông báo về chứng chỉ mới, nơi lưu trữ các file, và cách kiểm tra cấu hình:
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 đã được cài đặt và nạp vào cấu hình Apache. Hãy thử tải lại trang web bằng https://
và chú ý biểu tượng bảo mật trên trình duyệt. Nó thường hiển thị biểu tượng ổ khóa trên thanh địa chỉ, cho biết trang web đã được bảo mật đúng cách.
Bạn có thể sử dụng SSL Labs Server Test để xác thực mức độ an toàn của chứng chỉ, cũng như xem thông tin chi tiết về chứng chỉ từ góc nhìn của một dịch vụ bên ngoài.
Trong bước cuối, chúng ta sẽ kiểm tra tính năng tự động gia hạn của Certbot, đảm bảo chứng chỉ được gia hạn trước khi hết hạn.
Bước 5 – Kiểm tra tự động gia hạn của Certbot
Chứng chỉ của Let’s Encrypt chỉ có hiệu lực trong 90 ngày. Điều này khuyến khích người dùng tự động hóa quy trình gia hạn, cũng như đảm bảo rằng chứng chỉ bị lạm dụng hoặc Private Key bị đánh cắp sẽ sớm hết hạn.
Gói certbot mà ta cài đặt sẽ lo việc gia hạn nhờ một script renew
trong /etc/cron.d
, được quản lý bởi dịch vụ certbot.timer
của systemctl. Script này chạy hai lần mỗi ngày và sẽ tự động gia hạn bất kỳ chứng chỉ nào còn dưới 30 ngày sẽ hết hạn.
Để kiểm tra trạng thái dịch vụ và chắc chắn nó đang hoạt động, dùng:
sudo systemctl status certbot.timer
Bạn sẽ thấy output tương tự:
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.
Để thử quy trình gia hạn, bạn có thể chạy lệnh mô phỏng (dry run):
sudo certbot renew --dry-run
Nếu không thấy lỗi nào, bạn đã thiết lập xong. Khi cần, Certbot sẽ gia hạn chứng chỉ và tải lại Apache để áp dụng thay đổi. Nếu quy trình tự động gia hạn gặp lỗi, Let’s Encrypt sẽ gửi thông báo đến email bạn đã chỉ định, cảnh báo khi chứng chỉ sắp hết hạn.