Cách tạo Let’s Encrypt SSL Apache Server trên Ubuntu 20.04

18 May 2021
2 Comments

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

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:

/etc/apache2/conf-available/letsencrypt.conf
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>
/etc/apache2/conf-available/ssl-params.conf
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:

/etc/apache2/sites-available/example.com.conf
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:

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

2 thoughts on “Cách tạo Let’s Encrypt SSL Apache Server trên Ubuntu 20.04

Leave a Reply

This site uses cookies to offer you a better browsing experience. By browsing this website, you agree to our use of cookies.