Post

🎸 Tạo SSL/TLS miễn phí với OpenSSL và Let’s Encrypt

Ngày nay, hầu hết các website đều đã sử dụng giao thức HTTPS thay cho HTTP. HTTPS là phần mở rộng bảo mật của HTTP, nó là giao thức dùng cơ chế bảo mật SSL để mã hóa thông tin. Để sử dụng được giao thức này, chúng ta cần có một bộ chứng chỉ SSL/TLS để xác thực cho domain.

Vậy làm sao để có được chứng chỉ này một cách an toàn và miễn phí. Cùng tìm hiểu nhé.

SSL/TLS là gì?

SSL là Secure Sockets Layer (Lớp socket bảo mật), nó là một cơ chế bảo mật bằng cách mã hóa thông tin liên lạc giữa clien và server. TLS (Transport Layer Security), cũng là một cơ chế bảo mật – bảo mật lớp truyền dẫn (trong khái niệm mạng) – nó ra đời để thay thế cho SSL giờ không còn được phát triển. HTTPS – nó là một phần mở rộng của giao thức truyền nội dung text HTTP giữa client và server (giữa trình duyệt và máy chủ web), bản thông tin liên lạc bằng HTTP không được mã hóa, các gói tin có thể đọc được khi truyền dẫn.
HTTPS là giao thức dùng cơ chế bảo mật SSL/TLS để mã hóa thông tin.

SSL hoạt động như thế nào?

alt text TLS dùng public key và private key, có một số cách thức sử dụng TLS tạo ra kết nối an toàn, sơ đồ trên (one-way TLS) là một cách thức, nó hoạt động qua các bước:

  • Trình duyệt gửi yêu cầu một phiên làm việc an toàn tới máy chủ.
  • Máy trả về một chứng chỉ, chứng chỉ này có chứa public key của server, chứng chỉ này phát sinh bởi server và trên server có chứa private key nữa (private key không được gửi tới trình duyệt).
  • Trình duyệt cần ký nhận chứng chỉ, nó tạo ra yêu cầu tới CA (Certificate Authority) để chứng thực chứng chỉ.
  • Trình duyệt và máy chủ trao đổi một số thông tin để kiểm tra các key.
  • Trình duyệt và Server bắt đầu trao đổi dữ liệu được mã hóa TLS. Certificate Authority là nhà cung cấp chứng chỉ số (cung cấp public key/private key cho server) – CA phải đảm bảo được danh tính chính xác cụ thể của đối tượng (server, webiste) được cung cấp chứng chỉ – bằng cách xác nhận thông tin của cá nhân, tổ chức.

Tại sao cần sử dụng SSL/TLS?

Hai mục đích chính của SSL/TLS là:

  • Bảo mật đường truyền cho website.
    • Nếu chỉ sử dụng giao thức HTTP thì dữ liệu trao đổi giữa client và server sẽ không được mã hóa và bất kỳ máy tính nào ở giữa có thể bắt gói tin và đọc các thông tin nhạy cảm (username, password, thông tin thẻ tín dụng) từ gói tin đó.
  • Giúp cho website của bạn được xác thực, nâng cao độ tin tưởng cho người dùng.
    • Ngoài mã hóa, một chứng nhận SSL thích hợp cũng cung cấp sự xác thực. Hiểu nôm na là domain của bạn sẽ được một bên thứ 3 uy tín xác thực rằng nó thuộc sở hữu của cá nhân hoặc tổ chức của bạn. Điều này có nghĩa là khách hàng có thể chắc chắn rằng mình đang gửi thông tin đến đúng nơi chứ không phải đến một kẻ nào đó đang mạo danh cá nhân, tổ chức của bạn để cố gắng ăn cắp thông tin của khách hàng.

Ngoài ra, khi website của bạn sử dụng SSL/TLS nó sẽ dễ tiếp cận với người dùng hơn trên Google, vì Google sẽ ưu tiên hiển thị các website sử dụng https (HTTP + SSL/TLS) hơn khi tìm kiếm, các website sử dụng HTTP sẽ bị coi là unsafe.

Các loại chứng chỉ SSL/TLS

Chứng chỉ SSL được phân chia thành 3 loại chính, sẽ khác về cách xác thực và thông tin chứa trong chứng chỉ, nhưng khả năng bảo mật là như nhau:

  • DV SSL (Domain Validated): Chứng chỉ được xác thực với cấp độ tên miền.
  • OV SSL (Organization Validated): Chứng chỉ được xác thực với cấp độ doanh nghiệp/tổ chức.
  • EV SSL (Extended Validated): Chứng chỉ được xác thực với cấp độ doanh nghiệp/tổ chức mở rộng.

Một số cách để có chứng chỉ SSL miễn phí

  • Sử dụng CloudFlare: Đây là một website cung cấp dịch vụ tăng tốc và bảo mật website, họ có cung cấp chứng chỉ SSL ở gói Free, việc đăng ký cũng rất dễ dàng.
  • Sử dụng OpenSSL
  • Sử dụng Let’s Encrypt

Sử dụng OpenSSL để tạo SSL miễn phí

OpenSSL là công cụ mã hóa SSL/TLS, sử dụng nó để tạo/quản lý các public key/private key – dùng nó để sinh các chứng chỉ SSL tự xác thực. Vì là chứng chỉ tự xác thực nên bộ chứng chỉ SSL do OpenSSL sinh ra chỉ cung cấp mục đích bảo mật đường truyền chứ không được verify và Google cũng sẽ đánh dấu website sử dụng loại chứng chỉ này là unsafe. OpenSSL phù hợp cho việc:

  • Thực hành làm quen với SSL
  • Tạo SSL cho các domain nội bộ trong VLAN không cần xác thực

Các bước tạo chứng chỉ SSL với OpenSSL

Đầu tiên bạn chạy lệnh sau:

1
openssl genrsa -out ca.key 2048

Sau lệnh này openssl sinh ra file tên ca.key chứa RSA PRIVATE KEY. Tiếp theo chạy lệnh:

1
openssl req -new -key ca.key -out ca.csr

Bạn nhập các thông tin theo yêu cầu, ví dụ như sau:

1
2
3
4
5
6
Country Name (2 letter code) [XX]:VN
State or Province Name (full name) []:Ha Noi
Locality Name (eg, city) [Default City]:Ha Noi
Organization Name (eg, company) [Default Company Ltd]: alivu.com
Organizational Unit Name (eg, section) []:IT Department
Common Name (eg, your name or your server's hostname) []:alivu.com

Nếu hệ thống có hỏi thêm các thông tin: Email, Optional company name, hay Challenge password thì bỏ qua bằng cách nhấn Enter. Sau lệnh này openssl sinh ra file ca.csr chứa **CERTIFICATE REQUEST **(đây là file dùng để request chứng chỉ). Tiếp theo chạy lệnh để tự gen chứng chỉ:

1
openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt

Sau lệnh này nó sinh ra file CERTIFICATE tên: ca.crt Đến đây thu được các file để sử dụng:

Chứng chỉ (public key): ca.crt
Private key: ca.key

Lưu ý bật SSL module bằng câu lệnh, nếu không sẽ bị báo lỗi “Invalid command ‘SSLEngine’, perhaps misspelled or defined by a module not included in the server configuration”

1
2
sudo a2enmod ssl
sudo systemctl restart apache2 

Bạn có thể sử dụng 2 file này để cấu hình SSL cho website, nhưng vì đây là chứng chỉ tự xác thực nên trình duyệt sẽ xuất hiện cảnh báo.

Lúc này việc xác thực cần phải từ một CA, bạn có thể mua chứng chỉ SSL/TLS để có public key/private key và sử dụng như trên, hoặc lấy cert miễn phía từ CA Let’s Encrypt.

Sử dụng Let’s Encrypt để lấy SSL miễn phí

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. Đây là dịch vụ được cung cấp bởi Internet Security Research Group (ISRG). Để lấy cert SSL từ Let’s Encrypt, đầu tiên bạn cần cài đặt certbot – đây là công cụ lấy chứng chỉ SSL Let’s Encrypt

1
sudo apt install certbot python3-certbot-nginx

Kiểm tra xem certbot đã được cài đặt thành công hay chưa

1
certbot --version

Tiếp theo, bạn chạy lệnh phía dưới để gen cert SSL

1
certbot certonly --standalone -d elove.mobi --staple-ocsp -m test@elove.mobi --agree-tos

Lưu ý, vì cert SSL do Let’s Encrypt cung cấp là cert SSL cấp độ DV (chứng chỉ được xác thực với cấp độ tên miền) nên bạn phải đảm bảo tên miền trỏ về đúng về địa chỉ IP Public của server chạy lệnh certbot.

Ở đây server chạy lệnh certbot của mình có IP Public là 171.244.53.226 Có thể chạy câu lệnh sau để lấy địa chỉ IP public

1
curl ifconfig.io -4

Bạn phải đảm bảo trên DNS domain elove.mobi phải được trỏ đúng về IP Public này Nếu không, bạn sẽ gặp lỗi xác thực tên miền alt text

Nếu thành công , bạn sẽ nhận được 2 file để sử dụng

Chứng chỉ (public key): fullchain.pem
Private key: privkey.pem alt text

Đến đây, các bạn đã có chứng chỉ SSL miễn phí để sử dụng.

Cấu hình SSL cho một số tool phổ biến

Apache

1
2
3
4
5
6
7
<VirtualHost *:443>
    ...
    SSLEngine on
    SSLCertificateFile [đường dẫn đến ]fullchain.pem
    SSLCertificateKeyFile [đường dẫn đến]privkey.pem
    ...
</VirtualHost>

Nginx

1
2
3
4
5
6
7
server {
    listen 443 ssl;
    # RSA certificate
    ssl_certificate [đường dẫn đến ]fullchain.pem
    ssl_certificate_key [đường dẫn đến]privkey.pem
    include /etc/letsencrypt/options-ssl-nginx.conf;
}

Haproxy Haproxy nối cả file private key và public key thành 1 file để sử dụng nên chúng ta cần ghép 2 file này trước bằng lệnh

1
cat "privkey.pem" "fullchain.pem" > "ssl-cert.pem"

Trong khối pront end của haproxy có thể dùng

1
2
3
frontend https
    bind *:443 ssl crt [đường dẫn đến]ssl-cert.pem
    ...

Reference

  • Guide on Quoc9x 👉Link
This post is licensed under CC BY 4.0 by the author.