Trong bài này mình sẽ hướng dẫn tạo chứng chỉ SSL (Let’s Encrypt) trên Ubuntu Server được cài đặt Apache.
Chứng chỉ do Let’s Encrypt cấp có giá trị trong 90 ngày kể từ ngày cấp và được hầu hết tất cả các trình duyệt chấp nhận.
Qua bài này mình sẽ giải thích cách cài đặt chứng chỉ SSL Let’s Encrypt miễn phí trên Ubuntu 20.04 chạy Apache dưới dạng máy chủ web. Mình cũng sẽ hướng dẫn cách cấu hình Apache để sử dụng chứng chỉ SSL và bật HTTP/2.
Trước khi bắt đầu thì hãy chuẩn bị một số thứ sau:
Bài viết được đăng tại freetuts.net
- Đã mua một VPS để sử dụng, nếu chưa có thì tìm mua trong bài viết VPS tốt nhất.
- Mua domain và trỏ domain về địa chỉ IP của server. Nếu bạn chưa biết cách làm thì xem tại bài viết hướng dẫn trỏ tên miền về hosting.
- Đã tiến hành cài đặt Apache trênUbuntu
- Bạn đang đăng nhập bằng user sudo trên Ubuntu.
Ok, ta hãy bắt đầu thôi nhé.
1. Cài đặt Certbot trên Ubuntu
Chúng ta sẽ sử dụng Certbot package để tạo chứng chỉ SSL, đây là một công cụ chạy bằng dòng lệnh, nó sẽ tự động tạo và gia hạn chứng chỉ SSL từ Let’s Encrypt.
Certbot package mặc định có trong repo của Ubuntu, vì vậy bạn chỉ việc sử dụng lệnh apt để cài đặt.
1 2 | sudo apt update sudo apt install certbot |
2. Tạo Dh (Diffie-Hellman) trên Ubuntu
Diffie–Hellman là một phương pháp trao đổi thông tin khóa mật mã một cách an toàn qua những kênh không an toàn. Chúng ta sẽ tạo bộ DH 2048 bit để tăng cường bảo mật cho website.
1 | sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 |
Bạn có thể tăng lên thành 4096, tuy nhiên sẽ mất rất nhiều thời gian để chạy. Riêng mình thì thấy 2048 là quá đủ rồi, vì đa số các website nhỏ tại Việt Nam đều không cần bảo mật quá nhiều. Đối với những site lớn thị họ sẽ sử dụng SSL trả phí hơn là miễn phí.
3. Lấy chứng chỉ SSL của Let’s Encrypt
Để lấy được chứng chỉ SSL certificate cho domain thì chúng ta sử dụng plugin Webroot để xác thực tên miền được yêu cầu từ thư mục ${webroot-path}/.well-known/acme-challenge
.
Let’s Encrypt server sẽ tạo một request đến file tạm thời để xác thực rằng tên miền của bạn đang liên kết đến máy chủ có chạy certbot.
Để đơn giản hơn thì chúng ta sẽ ánh xạ tất cả các HTTP request cho .well-known/acme-challenge
vào một thư mục riêng /var/lib/letsencrypt.
.
Hãy chạy các lệnh dưới đây để thực hiện những điều trên.
1 2 3 | sudo mkdir -p /var/lib/letsencrypt/.well-known sudo chgrp www-data /var/lib/letsencrypt sudo chmod g+s /var/lib/letsencrypt |
Để tránh trùng lặp mã code và làm cho cấu hình dễ bảo trì hơn, hãy tạo hai đoạn mã cấu hình sau:
1 2 3 4 5 6 | Alias /.well-known/acme-challenge/ "/var/lib/letsencrypt/.well-known/acme-challenge/" <Directory "/var/lib/letsencrypt/"> AllowOverride None Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec Require method GET POST OPTIONS </Directory> |
1 2 3 4 5 6 7 8 9 10 11 | SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 SSLHonorCipherOrder off SSLSessionTickets off SSLUseStapling On SSLStaplingCache "shmcb:logs/ssl_stapling(32768)" SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem" Header always set Strict-Transport-Security "max-age=63072000" |
Đoạn mã trên đang sử dụng các chippers do Mozilla đề xuất, cho phép bật OCSP, bảo mật truyền tải thông tin nghiêm ngặt HTTP (HSTS) và thực thi một số bảo mật trên HTTP Header.
Trước khi chạy file cấu hình trên thì hãy đảm bảo rằng bạn đang bật mod_ssl và mod_headers, bằng cách chạy lệnh sau:
1 2 | sudo a2enmod ssl sudo a2enmod headers |
Tiếp theo, kích hoạt các file cấu hình SSL bằng cách chạy các lệnh sau
1 2 | sudo a2enconf letsencrypt sudo a2enconf ssl-params |
Việc bật HTTP/2 module sẽ giúp website chạy nhanh hơn.
1 | sudo a2enmod http2 |
Reload cấu hình của Apache để áp dụng những thay đổi trên bằng lệnh sau:
1 | sudo systemctl reload apache2 |
Bây giờ chúng ta có thể chạy công cụ Certbot với plugin webroot và lấy các file chứng chỉ SSL về server:
1 | sudo certbot certonly --agree-tos --email admin@example.com --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com |
Nếu chứng chỉ SSL được lấy thành công, certbot sẽ in thông báo sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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-10-06. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. 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 |
Bây giờ bạn đã có các file chứng chỉ SSL, hãy chỉnh sửa cấu hình máy chủ ảo tên miền của bạn như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <VirtualHost *:80> ServerName example.com Redirect permanent / https://example.com/ </VirtualHost> <VirtualHost *:443> ServerName example.com Protocols h2 http/1.1 <If "%{HTTP_HOST} == 'www.example.com'"> Redirect permanent / https://example.com/ </If> DocumentRoot /var/www/example.com/public_html ErrorLog ${APACHE_LOG_DIR}/example.com-error.log CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined SSLEngine On SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem # Other Apache Configuration </VirtualHost> |
Với cấu hình trên, Apache sẽ chuyển hướng từ www sang non-www.
Reload lại Apache để áp dụng những thay đổi:
1 | sudo systemctl reload apache2 |
Bây giờ bạn có thể truy cập vào website và nếu mọi việc thành công thì domain đã được kích hoạt SSL.
3. Tự động Review SSL Let’s Encrypt SSL certificate
Chứng chỉ của Let’s Encrypt có giá trị trong 90 ngày. Để tự động gia hạn chứng chỉ trước khi chúng hết hạn, certbot sẽ tạo một cronjob chạy hai lần một ngày và tự động gia hạn bất kỳ chứng chỉ nào trước khi hết hạn 30 ngày.
Sau khi chứng chỉ Let’s Encrypt được gia hạn, bạn phải reload lại Apache. Thêm --renew-hook
“systemctl reload apache2” vào file /etc/cron.d/certbot
:
1 | 0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --renew-hook "systemctl reload apache2" |
Để kiểm tra xem đã tạo đúng chưa thì chạy lệnh cerbot kết hợp tùy chọn --dry-run
.
1 | sudo certbot renew --dry-run |
Nếu không có lỗi gì thì tức là bạn đã tạo gia hạn tự động thành công.
Như vậy là mình đã hướng dẫn xong cách tạo chứng chỉ Let’s Encrypt SSL trên Apache Server cài đặt trên Ubuntu 20.04. Qua bài này bạn cũng đã biết cách thiết lập gia hạn Let’s Encrypt SSL tự động.
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.html [QSA,L]
sudo a2enmod rewrite