Cài đặt chứng chỉ SSL - Let’s Encrypt cho server Ubuntu 16.04 dùng Nginx

I. SSL là gì ? Tại sao phải dùng SSL?

SSL - Secure Sockets Layer là một tiêu chuẩn của công nghệ bảo mật, truyền thông mã hoá giữa máy chủ Web server và trình duyệt (browser). Tiêu chuẩn này hoạt động và đảm bảo rằng các dữ liệu truyền tải giữa máy chủ và trình duyệt của người dùng đều riêng tư và toàn vẹn. SSL hiện tại cũng là tiêu chuẩn bảo mật cho hàng triệu website trên toàn thế giới.
CÁC LOẠI CHỨNG THƯ SỐ SSL
- Domain Validation (DV - SSL) : Chứng thư số DV SSL chứng thực cho Domain Name - Website
- Organization Validation (OV -SSL) Chứng thư số OV SSL chứng thực cho Website và xác thực doanh nghiệp đang sở hữu website đó
- Extended Validation (EV -SSL) Chứng thư số EV SSL cho khách hàng của bạn thấy Website của bạn có độ bảo mật cao nhất và được rà soát pháp lý kỹ càng.
- Wildcard SSL Certificate Với việc tùy chọn thêm Wildcard SSL, một chứng thư số SSL có thể bảo mật cho tất cả các tên miền cấp dưới. Là sản phẩm lý tưởng dành cho các cổng thương mại điện tử.
- SANS - Nhiều tên miền hợp nhất trong 1 chứng thư số Một chứng thư số SSL tiêu chuẩn chỉ bảo mật cho duy nhất một tên miền đã được kiểm định.
VẬY TẠI SAO PHẢI DÙNG SSL :
- Sử dụng SSL cho website tăng độ tin cậy cho website.
- Bảo mật toàn vẹn dữ liệu: dữ liệu được mã hóa và chỉ người nhận đích thực mới có thể giải mã.
- Chống chối bỏ: đối tượng thực hiện gửi dữ liệu không thể phủ nhận dữ liệu của mình.
- Chứng thực doanh nghiệp - tránh giả mạo website.

II. Let’s Encrypt

  • Let’s Encrypt cung cấp cho người dùng một Open Certificate đáp ứng đầy đủ 3 tiêu chí : " ngon, bổ, rẻ ", đươc nhiều ông lớn hỗ trợ được Facebook, Chrome, Mozilla ...Let’s Encrypt là chứng chỉ SSL loại Domain Validation. Ngoài ra Let’s Encrypt còn có PositiveSSL của Comodo cũng được rất nhiều người sử dụng.

III. Cài đặt SSL - Let’s Encrypt cho server Ubuntu 16.04 dùng Nginx

1. Update package apt cho server và cài đặt letsencrypt
$ sudo apt-get update
$ sudo apt-get install letsencrypt
2. Cài đặt SSL Certificate
Có nhiều cách để lấy SSL Certificate, ở đây chúng ta sử dụng plugin Webroot để lấy SSL Certificate. Plugin Webroot đặt 1 tập tin đặc biệt trong thư mục /.well-known bên trong thư mục gốc. Let's Encrypt có thể mở được và xác định tính hợp lệ. Vì thế phải cấu hình cho cho phép truy cập vào thư mục /.well-known bằng cách thay đổi cấu hình mặc định của Nginx trong thư mục /etc/nginx/sites-available/default.
$ sudo nano /etc/nginx/sites-available/default
Sau đó add thêm đoạn đưới đây

location ~ /.well-known {
    allow all;
}

Kiểm tra lỗi xem có lỗi syntax không ?
$ sudo nginx -t
Nếu không có lỗi thì thực hiên restart Nginx
$ sudo systemctl restart nginx
Bây giờ khi đã biết đường dẫn của webroot, chúng ta sẽ tạo 1 chứng chỉ duy nhất với nhiều domain (Ex: haposoft.com và www.haposoft.com)
$ sudo letsencrypt certonly -a webroot --webroot-path=/var/www/haposoft.com -d haposoft.com -d www.haposoft.com
Khi khởi tạo, letsencrypt sẽ cần bạn cung cấp địa chỉ email và đồng ý với điều khoản. Nếu mọi thứ không có vấn đề gì, bạn sẽ nhận được một message thông báo thành công :

Output:
IMPORTANT NOTES:
 - If you lose your account credentials, you can recover through
   e-mails sent to sammy@digitalocean.com
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/haposoft.com/fullchain.pem. Your
   cert will expire on 2016-03-15. To obtain a new version of the
   certificate in the future, simply run Let's Encrypt again.
 - Your account credentials have been saved in your Let's Encrypt
   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 Let's
   Encrypt so making regular backups of this folder is ideal.
 - If like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Letsencrypt sẽ tạo ra các file Certificate được mã hóa bằng PEM như sau :
- cert.pem: Certificate cho tên miền
- chain.pem: Let's Encrypt certificate
- fullchain.pem: kết hợp cert.pem vàchain.pem
- privkey.pem: Private key của certificate
Các file này được đặt trong /etc/letsencrypt/archive, nhưng Letsencrypt đã tao 1 đường dẫn tượng trưng trong thư mục /etc/letsencrypt/live/your_domain_name. Và để chắc chắn việc khởi tạo thành công, check xem đã tồn tại các file trên chưa bằng câu lệnh:
$ sudo ls -l /etc/letsencrypt/live/your_domain_name
Để tăng tính bảo mật, chúng ta nên tạo ra 1 khóa Diffie-Hellman 2048-bit :
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Có thể mất 1 vài phút, khi hoàn tất chúng ta sẽ có 1 khóa Diffie-Hellman tại /etc/ssl/certs/dhparam.pem.
3. Cấu hình TLS/SSL cho Nginx
- Chúng ta sẽ thêm 1 vài thiết lập cho SSL để nâng cao tính bảo mật cho Nginx, cũng như 1 số tính năng nâng cao giúp server an toàn hơn. Vì các cấu hình này có thể được sử dụng lại nhiều lần nên chúng ta sẽ tạo ra 1 file có thể dùng chung :
$ sudo nano /etc/nginx/snippets/ssl-params.conf
Dưới đây là 1 vài thiết lập theo Remy van Elst trên Cipherli.st

# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable preloading HSTS for now.  You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

ssl_dhparam /etc/ssl/certs/dhparam.pem;
  • Cập nhật lại cấu hình Nginx
  • Trước khi thay đổi, chúng ta nên backup lại 1 file :
    $ sudo cp /etc/nginx/sites-available/haposoft.com /etc/nginx/sites-available/haposoft.com.bak
    Sau khi backup xong, chỉnh sửa lại file cấu hình
    $ sudo nano /etc/nginx/sites-available/haposoft.com
    Chúng ta cần thêm config cho phép listen 443 và đường dẫn tới các file fullchain.pem, privkey.pem và thêm config trong file ssl-params.conf chúng ta đã tạo ở trên. Chúng ta sẽ được 1 cấu hình hoàn chỉnh như sau :
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    server_name haposoft.com www.haposoft.com;
    return 301 https://$server_name$request_uri;
    ssl_certificate /etc/letsencrypt/live/haposoft.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/haposoft.com/privkey.pem;
    include snippets/ssl-params.conf;

    ...
}

Kiểm tra xem các config mới có lỗi không :
$ sudo nginx -t
Nếu tất cả ok, thì chúng ta sẽ nhận được kết quả :

Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Cuối cùng là restart lại Nginx :
$ sudo systemctl restart nginx
Bạn có thể kiểm tra lại kết quả bằng cách truy câp tên miền theo https:// hoặc có thể kiểm tra online :

In a web browser:
https://www.ssllabs.com/ssltest/analyze.html?d=haposoft.com

4. Thiết lập tự động gia hạn
Let’s Encrypt certificates có hiệu lực trong vòng 90 ngày vậy nên chúng ta cần phải thực hiện gia hạn certificates trước thời điểm hết hiệu lực. Thường thì khoảng 60 ngày. Chúng ta có thể giai hạn bằng cách :
$ sudo letsencrypt renew
Để tự động gia hạn thì chúng ta cần tạo 1 crontab để chạy lệnh gia hạn hàng tuần :
$ sudo crontab -e
Thêm các dòng dưới đây:

crontab entry
30 2 * * 1 /usr/bin/letsencrypt renew >> /var/log/le-renew.log
35 2 * * 1 /bin/systemctl reload nginx

Điều này sẽ tạo ra 1 cron job thực hiện việc letsencrypt-auto renew vào 2h30 và restart Nginx vào lức 2h35 sáng thứ 2 hàng tuần. Log sẽ được ghi lại ở /var/log/le-renew.log.
Công việc đến đây là kết thúc, chúc các bạn cài đặt thành công.
Hẹn gặp lại