Cài đặt chứng chỉ SSL Let’s Encrypt trên Linux

Tiếp tục thôi, bài này mình sẽ hướng dẫn chi tiết cách cài đặt và cấu hình SSL Certificate của Let’s Encrypt trên CentOS 7 Web Server. Bạn nào chưa biết Let’s Encrypt là gì thì đọc lại bài trước của mình nhé.

Như đã biết, muốn lấy chứng chỉ từ Letsencryp bản phải dùng Let’s Encrypt Client để tải về.

Trong bài này mình sẽ dùng Client Certbot. Tại sao lại dùng Certbot à, vì nó là Recommended Client được Let’s Encrypt khuyên dùng ^^.

Thứ hai là mình sẽ dùng Plugin webroot bởi plugin này dùng được cho cả webserver chạy apache và nginx. Quan trọng nhất là mình sẽ không phải stop port 80/443 khi chứng thực “authenticators” như plugin standalone vì sẽ làm gián đoạn website. Còn Plugin apache/nginx lại chỉ dùng riêng cho từng loại web server và đang trong giai đoạn thử nghiệm nên mình cũng không dùng.

Tài liệu tham khảo: certbot & webroot

Chuẩn bị

  • Bạn nên dùng VPS theo danh sách mà mình đã trải nghiệm.
  • Hệ điều hành CentOS 7
  • Web Server Nginx or Apache
  • Domain demo thuysys.xyz

1. Cài Let’s Encrypt

Phần này là cài đặt chung cho CentOS 7 áp dụng cả Web Server NGINX và APACHE.

Hiện package Certbot có sẵn trên kho của EPEL bạn add repo này vào server để lấy bộ cài đặt về.

Add repository EPEL

yum install epel-release

Cài Certbot

yum install certbot

Tạo thư mục .well-known trong Document Root của website

mkdir /var/www/thuysys.xyz/.well-known

Việc tạo thư mục ẩn .well-know chính là lời giải thích cho sự khác nhau giữa hai plugin webroot và standalone. Tại sao standalone phải stop webserver còn webroot thì không ?

Bạn là webmaster chắc không còn lạ gì với cách verify domain trên Google Webmaster Tool. Cách hoạt động của webroot cũng tương tự như vậy. Để “authenticators” với Let’s Encrypt, webroot sẽ tạo ra một file tạm trong thư mục .well-known sau đó Let’s Encrypt sẽ truy cập vào file đó để xác nhận domain của bạn. Cách làm này đơn giản mà hiệu quả, không như standalone bắt buộc sử dụng port 80/443 mới chịu.

Bước tiếp theo chúng ta chạy lệnh để cài SSL trên CentOS 7 từ Let’s Encrypt.

certbot certonly --webroot -w /var/www/thuysys.xyz -d thuysys.xyz -d www.thuysys.xyz

Giải thích mấy cái option một chút:

  • certonly nghĩa là bạn chỉ muốn lấy certificate thôi còn không install.
  • --webroot khai báo dùng plugin webroot.
  • -w là đường dẫn đến Document Root của website.
  • -d tên miền muốn dùng SSL.

Chạy lệnh trên, sẽ có thông báo yêu cầu bạn nhập địa chỉ email. Đây là email sở hữu chứng chỉ để sau này có vấn đề gì còn có cái liên hệ. Ví dụ mình nhập admin@thuysys.xyz.

Nhập Email quản lý chứng chỉ.

Email

Đồng ý với điều khoản (TOS) của Let’s Encrypt, chọn Agree

TOS Let's Encrypt

Nếu không muốn phải nhập thông tin gì khi lấy chứng chỉ SSL bạn chạy lệnh sau.

certbot certonly --webroot -w /var/www/thuysys.xyz -d thuysys.xyz -d www.thuysys.xyz --agree-tos --email admin@thuysys.xyz

Cài SSL cho CentOS  bạn có thể mở file log của Web Server để xem quá trình authenticators domain giữa Web Server với Let’s Encrypt.

66.133.109.36 - - [19/Jul/2016:07:50:48 +0000] "GET /.well-known/acme-challenge/wzCKwmsw9pAOdM_HOacafzZ0AHAgv8TF91FQrmwbCFc HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)" "-"

Sau bước này bạn đã lấy chứng chỉ SSL cho domain thuysys.xyz thành cồng. Toàn bộ chứng chỉ sẽ được lưu tại /etc/letsencrypt/live/thuysys.xyz/ gồm 4 file.

  • cert.pem file chứng chỉ domain của bạn, nếu người dùng truy cập thuysys.xyz Webserver sẽ gửi chứng chỉ này cho web browser cũng với Public Key được sinh ra từ privkey.pem.
  • privkey.pem đây là Private Key nó dùng để giải mã Public Key. File này rất quan trong bạn phải bảo mật cẩn thận.
  • chain.pem là chứng chỉ của Root CA đơn vị cao nhất xác minh sự tồn tại của CA trung gian. Cách hoạt động SSL Certificate theo kiểu đệ quy giống với truy vấn DNS. Root CA là cao nhất quản lý các thằng CA cấp thấp hơn, Let’s Encrypt cũng là một CA trùng gian cấp thấp.
  • fullchain.pem file gộp, bao gồm chứng chỉ của domain và root CA đầy đủ nhất (cert.pem + chain.pem).

Tiếp theo chúng ta sẽ đi cấu hình Web Server sử dụng chứng chỉ SSL vừa lấy được.

2. Cấu hình nginx sử dụng SSL

Mở file config nginx, bạn thêm vào block server {…} mấy chỉ thị sau.

listen 443 ssl default_server;
ssl_certificate /etc/letsencrypt/live/thuysys.xyz/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/thuysys.xyz/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

Đến bước này bạn chỉ cần restart nginx là dùng được SSL rồi.

Chuyển hướng http sang https

Nhiều người vẫn gọi là Redirect sang https. Chỗ này nói thêm, vì mình muốn bất kỳ ai gõ tên miền thuysys.xyz trên address bar có www hay non-www đều tự động chuyển sang https://www.thuysys.xyz. Nên mình sẽ phải thêm đoạn code cấu hình redirect url cho nginx như bên dưới.

if ($scheme = http) {
return 301 https://www.thuysys.xyz$request_uri;
}

Mình thích dùng directive return để cấu hình redirect hơn vì nó đơn giản và được nginx khuyên dùng. Ngoài ra bạn có thể cấu hình dùng directive rewrite mà vẫn đạt được mục đích trên.

3. Cấu hình Apache sử dụng SSL.

Cũng tương tự như Nginx để cài Let’s Encrypt cho Apache bạn cũng tạo folder .well-known trong Document Root sau đó chạy lệnh certbot lấy chứng chỉ cho domain.

Với Apache bạn phải kiểm tra mod_ssl đã được cài đặt hay chưa, nếu chưa cài thì cài bổ sung vào.

yum install mod_ssl

Khi mod_ssl được cài thành công bạn sẽ thấy file config ssl trong /etc/httpd/conf.d/ssl.conf

Backup file config phòng rủi ro

cp /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.bak

Nếu server của bạn chạy Virtual Host cho nhiều website thì bạn chỉ việc đổi tên ssl.conf thanh Virtual Host tương ứng.

mv /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl-thuysys.xyz.conf

Sau đó mở file ssl_thuysys.xyz.conf sửa đổi một chút để cấu hình ssl cho tên miền của mình.

<VirtualHost _default_:443>
DocumentRoot /var/www/thuysys.xyz
ServerName www.thuysys.xyz:443
SSLCertificateFile /etc/letsencrypt/live/thuysys.xyz/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/thuysys.xyz/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/thuysys.xyz/chain.pem

SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH

...

</VirtualHost>

Chuyển hướng http sang https

Cấu hình Redirect URL trên Apache sang https://www.thuysys.xyz khác so với nginx. Bạn thêm dòng bên dưới vào <VirtualHost>…</VirtualHost>

Redirect permanent / https://www.thuysys.xyz

Trên Apache cũng có nhiều cách để thay đổi URL theo sở thích riêng, bạn có thể dùng mod_rewrite để làm được việc này. Cách sử dụng mod_rewrite mọi người tự mần nhé.

4. Gia hạn chứng chỉ Let’s Encrypt

Toàn bộ thông tin chứng chỉ của bạn được mô tả trong file /etc/letsencrypt/renewal/thuysys.xyz.conf

Với nội dung:

# renew_before_expiry = 30 days
version = 0.8.1
cert = /etc/letsencrypt/live/thuysys.xyz/cert.pem
privkey = /etc/letsencrypt/live/thuysys.xyz/privkey.pem
chain = /etc/letsencrypt/live/thuysys.xyz/chain.pem
fullchain = /etc/letsencrypt/live/thuysys.xyz/fullchain.pem

# Options used in the renewal process
[renewalparams]
authenticator = webroot
installer = None
account = 48c642e6815eb3a0c4c5ec98837976ac
webroot_path = /var/www/thuysys.xyz
[[webroot_map]]
www.thuysys.xyz = /var/www/thuysys.xyz
thuysys.xyz = /var/www/thuysys.xyz

Như vậy bạn chỉ có thể xin cấp mới chứng chỉ khi thời gian sử dụng còn lại 30 ngày.

Vì lý do nào đó bạn muốn xin cấp mới chứng chỉ sớm hơn thời hạn bạn chạy lệnh sau cho mình.

certbot renew --webroot -w /usr/share/nginx/html --force-renew

Kết quả như bên dưới là thành công.

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/thuysys.xyz.conf
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/thuysys.xyz/fullchain.pem
-------------------------------------------------------------------------------

Congratulations, all renewals succeeded. The following certs have been renewed:
 /etc/letsencrypt/live/thuysys.xyz/fullchain.pem (success)

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/thuysys.xyz.conf
-------------------------------------------------------------------------------

Muốn Auto Renewal bạn phải tạo một crontab để tự động chạy lệnh renewal ở trên định kỳ.

0 0 1 */2 * certbot renew --webroot -w /usr/share/nginx/html --force-renew

Crontab ở trên sẽ tự động gia hạn chứng chỉ sau hai tháng.

5. Kiểm tra hoạt động SSL

Thế là xong, bạn lưu file config lại rồi khởi động Web Server. Mở trình duyệt ra truy cập vào địa chỉ thuysys.xyz để tận hưởng thành quả.

Như hình bên dưới là SSL hoạt động tốt rồi.

Cấu hình SSL Nginx

NGINX

Cấu hình SSL Apache

Apache

Thêm bước kiểm tra SSL tương thích với trình duyệt nữa cho chuẩn, mình dùng công cụ tại ssllabs.com kết quả :

Kiểm tra hoạt động SSL

Tuyệt với,  A+ là qúa ngon rồi bạn check mà điểm không được mức A là phải xem lại cấu hình SSL trên server nhé.

6. Kết bài

Cấu hình Let’s Encrypt SSL không khó chỉ cần vận dụng tốt Client và Plugin là làm được. Có thời gian mình sẽ hướng dẫn sử dụng Certificate tại Let’s Encrypt để cài SSL cho Ubuntu cho các bạn, thông số cấu hình cũng như nội dung bài này chỉ khác chút về đường dẫn thôi.

Ngoài ra nếu muốn có thương hiệu bạ có thể mua SSL của Namecheap hoặc GogetSSL với giá chỉ khoảng $3/năm, tham khảo bài viết.

Chúc các bạn có thứ hạng cao trên google 🙂

6 Comments

  1. Tam November 26, 2018 Reply
    • Mr Thủy November 26, 2018 Reply
  2. Thanhduy October 17, 2017 Reply
    • Mr Thủy October 17, 2017 Reply
  3. Dũng July 15, 2017 Reply
  4. The Wind July 1, 2017 Reply

Leave a Reply