Thế nào là SSL/TLS

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.

Các máy chủ web thường cấu hình để cổng 80 là giao thức HTTP và cổng 443 là giao thức HTTPS

Cách thức hoạt động TLS HTTPS

ssl

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

Sử dụng OPENSSL

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

Trên CentOS có thề cài openssl với lệnh:

yum install mod_ssl openssl

Phát sinh các chứng thực - file certificate

Giả sử các file sinh ra bạn sẽ lưu trữ ở thư mục /home/xuanthulab.net/cert

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

openssl genrsa -out ca.key 2048
ssl

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:

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:

Country Name (2 letter code) [XX]:VN
State or Province Name (full name) []:VIETNAM
Locality Name (eg, city) [Default City]:Hanoi
Organization Name (eg, company) [Default Company Ltd]: XUANTHULAB.NET
Organizational Unit Name (eg, section) []:XUANTHULAB.NET
Common Name (eg, your name or your server's hostname) []:XUANTHULAB.NET
Email Address []: info@xuanthulab.net

Sau lệnh này openssl sinh ra file ca.csr chứa CERTIFICATE REQUEST.

Tiếp theo chạy lệnh

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

Cấu hình cho VirtualHost (Apache HTTPD) với cổng 443

Để sử dụng các file phát sinh trên, cấu hình VirtualHost như sau:

<VirtualHost *:443>
        ServerName yoursite.com
        SSLEngine on
        SSLCertificateFile /home/xuanthulab.net/cert/ca.crt
        SSLCertificateKeyFile /home/xuanthulab.net/cert/ca.key
        <Directory /var/www/vhosts/yoursite.com/httpsdocs>
            AllowOverride All
        </Directory>
        DocumentRoot /var/www/vhosts/yoursite.com/httpsdocs
</VirtualHost>

Lúc này có thể truy cập với https://yoursite.com, tuy nhiên chứng thực ở đây là tự xác thực, nên trên trình duyệt có thể 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í

Mã nguồn các letsencrypt cần clone về và sử dụng, sử dụng git để tải về, nếu chưa có git thì cài đặt bằng lệnh:

yum install epel-release
yum install git

Ở đây sẽ lấy mã nguồn các script của letsencrpyt về lưu trong thư mục /usr/local/

cd /usr/local/
git clone https://github.com/letsencrypt/letsencrypt

Lấy chứng chỉ TLS

Tên miền xin chứng chỉ cần đảm báo trỏ về dúng địa chỉ IP của server chứa mã nguồn letsencrypt vừa tải trên. Ví dụ lấy chứng chỉ cho domain xuanthulab.net

cd /usr/local/letsencrypt
./letsencrypt-auto  -d xuanthulab.net

Sau khi chứng chỉ được phát sinh, có cũng có thể tự cấu hình cho Apache sử dụng chứng chỉ luôn, nếu có Apache HTTP

Cần khởi động lại Apache HTTPD

service httpd restart

Hoặc sử dụng thủ công các file public và private key lấy được

Như vậy đã có chứng chỉ SSL miễn phí từ https://letsencrypt.org/, nó có thời hạn 90 ngày. Hết 90 ngày bạn cần gia hạn tiếp:

/usr/local/letsencrypt/letsencrypt-auto --renew-by-default -d xuanthulab.net

Sử dụng container certbot/certbot lấy chứng chỉ

Let's Encrypt cung cấp một image để có thể lấy chứng chỉ miễn phí, giả sử cần lấy chứng chỉ cho tên miền abc.xuanthulab.net chạy lệnh docker sau:

# tao thư mục lưu chứng chỉ
mkdir letsencrypt
docker run -it --rm --name certbot \
    -v "$(pwd)/letsencrypt:/etc/letsencrypt" \
    -v "$(pwd)/letsencrypt:/var/lib/letsencrypt" certbot/certbot \
    -d abc.xuanthulab.net \
    --server https://acme-v02.api.letsencrypt.org/directory --preferred-challenges dns --manual certonly

Khi nó hỏi email, điền email của bản vào. Tiếp theo nhấn A đồng ý các điều khoản, nhấn Y khi hỏi về việc theo dõi IP. Cuối cùng nó sinh ra một thông tin cần cấu hình cho TXT Record của tên miền. Vào phần quản trị tên miền và thêm loại Record này với tên và giá trị nó vừa cung cấp.

Sau đó nó sẽ cấp cho public và private key lưu tại thư mục letsencrypt/live/abc.xuanthulab.net, các file là fullchain.pemprivkey.pem, hai file này có thể cấu hình sử dụng bởi Apache HTTPD (trong virtualhost)

<VirtualHost *:443>
        ...
        SSLEngine on
        SSLCertificateFile [đường dẫn đến ]fullchain.pem
        SSLCertificateKeyFile [đường dẫn đến]privkey.pem
        ...
</VirtualHost>

Nếu sử dụng nginx

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;
}

Nếu bạn muốn nối cả private và public key thành một file (ví dụ Haproxy sử dụng dạng này) thì dùng lệnh:

cat "privkey.pem" "fullchain.pem" > "abc.xuanthulab.pem"

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

frontend https
    bind *:443 ssl crt [đường dẫn đến]abc.xuanthulab.pem
    ...
Đăng ký theo dõi ủng hộ kênh