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
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
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í
Cài đặt Certbot, công cụ lấy chứng chỉ SSL Let's Encrypt
Thực hiện các lệnh sau:
yum install epel-release yum install certbot python2-certbot-apache python2-certbot-nginx mod_ssl
Kiểm tra
certbot --version
Lấy chứng chỉ TLS SSL (áp dụng máy chủ Apache HTTPD hoặc Nginx)
Tên miền xin chứng chỉ cần đảm báo trỏ về dúng địa chỉ IP của server chạy lệnh certbot
vừa tải trên. Ví dụ lấy chứng chỉ cho domain xuanthulab.net
certbot -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:
Trước thời hạn hết hạn, bạn chạy lệnh sau:
certbot renew
Lệnh trên CertBot sẽ cấp mới tất cả các chứng chỉ (cho các domain đã từng cấp) trên máy.
Tự động gia hạn SSL
Sử dụng CronbTab để chạy lệnh này cấp mới chứng chỉ. Ví dụ, cứ 2h sáng vào ngày 1 hàng tháng thì chạy, ta tạo crontab như sau:
crontab -e
Sau đó nhập vào
0 2 1 * * /usr/bin/certbot renew >/dev/null 2>&1
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.pem
và privkey.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 ...