Tìm hiểu về Let's Encrypt SSL

Tìm hiểu về Let's Encrypt SSL

Giới thiệu

SSL là gì

SSL (Secure Sockets Layer) và người kế vị của nó, TLS (Transport Layer Security), là các giao thức để thiết lập các liên kết được xác thực và mã hóa giữa các máy tính nối mạng.
SSL có 4 loại cơ bản sau
→ Domain Validation (DV) Đây là loại chứng chỉ thấp nhất và ai cũng có thể sử dụng bằng cách xác thực tên miền.
→ Organization Validation (OV) Chứng chỉ này cao cấp hơn DV nhằm để xác thực danh tính tổ chức.
→ Individual Validation (IV) đây là dạng xác thực danh tính cá nhân người yêu cầu chứng chỉ.
→ Extended Validation (EV) dạng chứng chỉ này cũng là xác thực danh tính tổ chức nhưng cao hơn OV.

Tầm quan trọng của SSL

Có thể nói rằng, SSL giống như một "xương sống" trong việc đảm bảo an toàn trên Internet. Nó giúp bảo vệ những thông tin nhạy cảm khi chúng được truyền qua các mạng máy tính trên thế giới. SSL là cần thiết để bảo vệ trang web của bạn, dù cho không có những thông tin nhạy cảm như thẻ tín dụng. Nó cung cấp sự riêng tư, bảo mật nghiêm ngặt và toàn vẹn cho dữ liệu của cả trang web và thông tin cá nhân của người truy cập.

Vì sao nên đặt SSL cho website

Từ năm 2014, Google đã chính thức ưu tiên các website hỗ trợ giao thức HTTPS trên kết quả tìm kiếm. Để giảm nguy cơ giả danh, đảm bảo an toàn cho người dùng, tích hợp chứng chỉ SSL/TLS vào một website là sự lựa chọn vô cùng hợp lý, và cần thiết.

Let's Encrypt là gì

Let’s Encrypt là chứng nhận (CA) mở, miễn phí và tự động, hoạt động vì lợi ích cộng đồng. Được cung cấp bởi Internet Security Research Group (ISRG). Let’s Encrypt cung cấp cho mọi người các chứng chỉ kỹ thuật số họ cần để kích hoạt HTTPS (SSL/TLS) cho các trang web, hoàn toàn miễn phí.
Let's Encrypt cung cấp chứng chỉ SSL loại Domain Validation, tức là sau khi cài đặt, khi người dùng vào trang web sẽ có một ổ khóa trên thanh địa chỉ của trình duyệt.

Lợi ích khi sử dụng Let’s Encrypt

→ Miễn phí: hoàn toàn miễn phí, tuy cần phải gia hạn 3 tháng một lần, tuy nhiên việc này hoàn toàn có thể tự động hóa.
→ Tự động: tự động gia hạn ...
→ An toàn
...

Lấy chứng chỉ SSL của Let’s Encrypt

Trong phần này, mình sẽ hướng dẫn cách lấy chứng chỉ SSL cho domain của bạn. Trang web được lưu trữ trên Ubuntu Server 20.04LTS với Nginx làm Reverse Proxy cho Apache và NodeJS (tùy ứng dụng bạn dùng/viết)
Yêu cầu hệ thống:
→ Ubuntu Server
→ Đã cài đặt Nginx, Apache, NodeJS

Chứng chỉ cho domain chính

Có nhiều cách cài, mình đã thử cài từ apt và snap, tuy nhiên khi mình cài từ apt, khi thực hiện lấy SSL cho subdomain (phần dưới) xảy ra lỗi, do đó mình sử dụng snap để cài. Một vấn đề nữa là khi cài bằng apt thì dùng plugin nào phải cài plugin đó (ví dụ như nginx, apache phải dùng 2 plugin khác nhau), cài bằng snap sẽ có luôn một số plugin cần thiết cho bạn. Bạn có thể cài thử bằng hai cách, và sử dụng "sudo certbot plugins" để kiểm tra số plugin đang cài để thấy sự khác biệt.
→ Cập nhập phiên bản mới nhất của snap

sudo snap install core; sudo snap refresh core

→ Cài đặt certbot, nếu đã cài bằng apt để tránh xung đột hãy gỡ ra trước khi cài bằng snap.

sudo snap install --classic certbot

Thực hiện lệnh sau để đảm bảo rằng certbot lệnh có thể chạy được.

sudo ln -s /snap/bin/certbot /usr/bin/certbot

Chạy lệnh này sau để xác nhận rằng plugin đã cài đặt sẽ có cùng chức năng với Certbot.

sudo snap set certbot trust-plugin-with-root=ok

→ Cho phép HTTPS được thông qua Firewall
Nếu bạn đã bật Firewall, bạn sẽ cần cài đặt để cho phép lưu lượng HTTPS thông qua Firewall. Như ở bài này, chúng ta đã cài đặt cho phép Nginx HTTP chạy qua Firewall mà chưa cho cả HTTPS nên chúng ta sẽ thêm vào.

sudo ufw delete allow 'Nginx HTTP'
sudo ufw allow 'Nginx Full'

Kiểm tra lại, nếu hiện như hình dưới là được

sudo ufw status

→ Kiểm tra đã có Server Block trong cấu hình của Nginx chưa. Ở bài này mình sẽ làm thử trên NextCloud đã cài ở đây. Kiểm tra file cấu hình

nano /etc/nginx/sites-available/cloud.local

Nhìn phần "server_name" có giá trị hay chưa, trong ví dụ này của mình là cloud.local, nếu chưa có nhập vào cho đúng, trong đó cloud.local là domain của bạn

server {
...
    server_name cloud.local; #đã có server_name
...
}

→ Lấy chứng chỉ SSL.

sudo certbot --agree-tos --no-eff-email --email your-email --nginx -d cloud.local -d www.cloud.local

Trong đó your-email là email của bạn, nhập chính xác để "nhỡ" quên gia hạn thì Let’s Encrypt sẽ gửi email thông báo đến. cloud.local là domain mà bạn cần dùng chứng chỉ, nếu bạn thử với domain như mình thì chắc chắn không được đâu nhé, lỗi ngay "The server will not issue certificates for the identifier :: Error creating new order :: Cannot issue for "cloud.local": Domain name does not end with a valid public suffix (TLD)"

prefix --nginx là chúng ta sử dụng plugin cho nginx của certbot, nếu muốn dùng cho Apache thì chúng ta dùng tiền tố --apache
certbot sẽ tự động điền cấu hình vào file cấu hình của domain trong /etc/nginx/sites-available/cloud.local cho bạn, tuy nhiên có một số trường hợp gây ra xung đột, khi đó bạn cần sửa lại chút cấu hình là được. Ví dụ đây là một cấu hình của mình:
#/etc/nginx/sites-available/apache
#manhhadev.tk
server {
    listen 80;
    listen [::]:80;
    server_name manhhadev.tk www.manhhadev.tk;
	return 301 https://$server_name$request_uri;
}
server {
    listen 443 ssl;
	server_name manhhadev.tk www.manhhadev.tk;
	root /var/www/manhhadev.tk;
    index index.php index.htm index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        proxy_pass http://192.168.0.16:8888;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location ~ /\.ht {
        deny all;
    }
    ssl_certificate /etc/letsencrypt/live/manhhadev.tk/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/manhhadev.tk/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

Ở đoạn ssl_certificate và ssl_certificate_key, để tìm chính xác bạn có thể làm như sau. Truy cập vào thư mục "/etc/letsencrypt/live/manhhadev.tk" bằng quyền root, và kiểm tra coi tồn tại 2 file fullchain.pem và privkey.pem hay không

sudo find /etc/letsencrypt/live/manhhadev.tk -name *.pem

Các chứng chỉ của bạn đã được tải xuống và cài đặt. Hãy thử truy cập trang web của bạn bằng cách sử dụng https:// bạn sẽ thấy nó có biểu tượng ổ khóa. Kiểm tra lại bằng công cụ của SSL Labs, máy chủ sẽ đạt điểm A, của mình là A+

Như vậy chúng ta đã lấy được chứng chỉ SSL cho domain, tuy nhiên, trong trường hợp chúng ta có nhiều subdomain, muốn sử dụng SSL lại phải lấy chứng chỉ cho từng subdomain → rất mất thời gian. Phần sau chúng ta sẽ tìm hiểu cách lấy SSL cho subdomain bằng Wildcard SSL Certificates.

Chứng chỉ cho subdomain

→ Wildcard SSL Certificates là gì?
Chứng chỉ Wildcard SSL dành cho các website có nhu cầu sử dụng SSL cho không giới hạn subdomain của một domain chính chỉ với một chứng chỉ duy nhất. Ví dụ khi đăng ký Wildcard SSL cho tên miền *.manhha.dev bạn có thể sử dụng cho toàn bộ các subdomain như: tiengnhat.manhha.dev, love.manhha.dev, learn.manhha.dev, gallery.manhha.dev ...
→ Cấu hình Wildcard DNS
Đảm bảo cấu hình DNS của bạn có bản ghi wildcard DNS *.example.com trỏ về IP của bạn.

Để kiểm tra xem wildcard DNS có hoạt động như dự kiến ​​hay không, hãy sử dụng hostlệnh để truy vấn một vài tên máy chủ:

host gi-cung-duoc.manhha.dev

Kết quả trả về là IP của bạn thiết lập → hoạt động chính xác.
→ Cài DNS plugin cho certbot, mình sử dụng cloudflare nên mình cài plugin của cloudflare

sudo snap install certbot-dns-cloudflare

Nếu bạn dùng của nhà cung cấp khác thì xem danh sách plugin ở đây, và thực hiện lệnh sau

sudo snap install certbot-dns-<PLUGIN>

Kiểm tra đã có plugin cloudflare cài vào chưa, kết quả có dns-cloudflare là được.

certbot plugins
luffy@luffydev:~$ certbot plugins
-----
* dns-cloudflare
Description: Obtain certificates using a DNS TXT record (if you are using
Cloudflare for DNS).
Interfaces: Authenticator, Plugin
Entry point: dns-cloudflare =
certbot_dns_cloudflare._internal.dns_cloudflare:Authenticator
----

→ Cấu hình Certbot plugin
Vì Certbot cần kết nối với nhà cung cấp DNS của bạn và tạo các bản ghi DNS, nên bạn cần cấp quyền cho Certbot. Điều này liên quan đến việc nhận mã thông báo API hoặc thông tin xác thực khác từ nhà cung cấp DNS của bạn và đưa nó vào tệp thông tin xác thực bảo mật mà Certbot sẽ đọc từ đó.
★ Bước 1: Tạo Cloudflare API Token
Truy cập vào trang https://dash.cloudflare.com/profile/api-tokens để tạo token. Bấm vào "Create Token"

trong danh sách hiện ra chọn "Use template" ứng với phần "Edit zone DNS"

Phần "Permissions" để mặc định dạng Zone:DNS:Edit
Phần "Zone Resources" chọn IncludeSpecific Zonetên domain
Sau đó bấm "Continue to Summary"

Xác nhận lại và "Create Token"

Phần "API Tokens", copy lại, vì lý do bảo mật nên sau này sẽ không hiển thị lại Token này → lưu tạm vào nơi nào để lát nữa sử dụng.

Vì mỗi nhà cung cấp có quy trình xác thực khác nhau, vui lòng tham khảo tài liệu dành cho plugin Certbot DNS để biết thêm thông tin.

★ Bước 2: cấu hình cho plugin
Đối với ví dụ này, chúng tôi sẽ tiếp tục sử dụng dns-cloudflare và sẽ lưu trữ thông tin đăng nhập của chúng tôi trong tệp ~/certbot-creds.ini

nano ~/certbot-creds.ini

File này nằm ở thư mục home của user (/home/ten-user), nhập vào nội dung sau, trong đó dns_cloudflare_api_token là API Tokens chúng ta vừa lấy được ở trên.

dns_cloudflare_api_token = 1234567890123456789abbakjshieryoiqererei

Sau khi tạo tệp, cần hạn chế quyền của tệp để bí mật của bạn không bị lộ cho người dùng khác. Lệnh sau chmod sẽ chỉ cấp quyền đọc và ghi cho người dùng của bạn:

chmod 600 ~/certbot-creds.ini

★ Bước 3: lấy chứng chỉ

sudo certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials ~/certbot-creds.ini \
  -d '*.manhha.dev'

Bạn đã tạo thành công chứng chỉ wildcard SSL! Khi tạo wildcard thì ứng dụng sẽ không tự cập nhập vào file cấu hình, mà mỗi khi cần sử dụng thì bạn cần phải tự cấu hình sau.
★ Bước 4: cập nhập cấu hình
Về cơ bản, ví dụ với Nginx thì trong Server Block cần có các thông tin sau

server {
    listen 443 ssl;
	server_name gì-cũng-được.manhha.dev;
	###Phần xác thực chứng chỉ SSL
    ssl_certificate /etc/letsencrypt/live/manhha.dev-0001/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/manhha.dev-0001/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

Có một điều cần lưu ý là Wildcard SSL thì chỉ sử dụng được cho subdomain, ví dụ là *.manhha.dev, còn domain chính vẫn cần tạo riêng. Do đó bạn có thể thấy ở trên thư mục chứa chứng chỉ cho subdomain của mình là manhha.dev-0001, vì trước đó mình đã lấy chứng chỉ cho domain chính manhha.dev và lưu ở thư mục manhha.dev.

Kiểm tra tự động gia hạn

Chứng chỉ của Let’s Encrypt yêu cầu người dùng phải gia hạn sau 90 ngày. Tuy nhiên khi sử dụng certbot sẽ tự động gia hạn, kiểm tra xem trạng thái của snap.certbot.renew.timer có hoạt động không

sudo systemctl status snap.certbot.renew.timer

Nếu hiện "Active: active (waiting)" là hoạt động nhé.

Để kiểm tra quá trình gia hạn, chạy thử với

sudo certbot renew --dry-run

Để hiển thị các mục nhật ký của snap.certbot.renew.timer:

journalctl -u snap.certbot.renew.timer

Kết luận:

Bài viết này mình đã giới thiệu với các bạn SSL là gì, tại sao cần SSL và cách lấy cũng như tự động gia hạn SSL tự động. Nếu có khó khăn hay có câu hỏi gì hãy đừng ngại ngần mà viết comment ở phần bên dưới nhé.
Chúc các bạn thành công!!!

Đọc thêm:

Cài đặt Ubuntu server 20.04 LTS
Hướng dẫn cài đặt LAMP(Linux, Apache, MariaDB, PHP) trên Ubuntu server 20.04
Hướng dẫn cài đặt Nginx trên Ubuntu Server 20.04
Cài Nginx làm reverse proxy cho Apache
Cài đặt NodeJS trên Ubuntu Server 20.04