Để thiết lập kết nối HTTPS an toàn trong môi trường không có tên miền công khai hoặc chứng chỉ từ nhà cung cấp bên ngoài, việc xây dựng một Trung tâm Xác thực (Certificate Authority – CA) nội bộ là giải pháp kỹ thuật phổ biến và hiệu quả. Quá trình này bao gồm hai giai đoạn chính: (1) khởi tạo và ký chứng chỉ CA, và (2) phát hành chứng chỉ máy chủ cho dịch vụ web (Apache hoặc Nginx), đảm bảo xác thực danh tính và mã hóa end-to-end.
1. Thiết lập Trung tâm Xác thực Nội bộ
Trên máy chủ đóng vai trò CA (ví dụ: ca-server.local, IP 192.168.5.101), thực hiện các bước sau:
Cấu hình OpenSSL để bật vai trò CA bằng cách chỉnh sửa tệp cấu hình:
sudo sed -i 's/^#.*basicConstraints = .*/basicConstraints = CA:TRUE/' /etc/pki/tls/openssl.cnfTạo khóa riêng tư và chứng chỉ gốc CA với thời hạn 3 năm:
sudo /etc/pki/tls/misc/CA -newca <<EOF 123456 123456 CN beijing haidian test IT ca-server.local admin@test.local EOFKết quả sinh ra chứng chỉ gốc tại
/etc/pki/CA/cacert.pemvà khóa riêng tư tại/etc/pki/CA/private/cakey.pem.
2. Phát hành Chứng chỉ Máy chủ cho Dịch vụ Web
Trên máy chủ ứng dụng (ví dụ: web-server.local, IP 192.168.5.102):
Tạo cặp khóa RSA 2048-bit với mật khẩu bảo vệ:
openssl genrsa -des3 -out /etc/ssl/private/webserver.key 2048 <<EOF 123456 123456 EOFTạo yêu cầu ký chứng chỉ (CSR) với thông tin phù hợp — đặc biệt lưu ý
CommonNamephải khác với tên CA và phản ánh tên máy chủ đích:openssl req -new -key /etc/ssl/private/webserver.key -out /tmp/webserver.csr <<EOF 123456 CN beijing haidian test IT web-server.local admin@test.local EOFGửi CSR đến CA và ký bằng khóa gốc:
# Trên ca-server.local sudo openssl ca -keyfile /etc/pki/CA/private/cakey.pem \ -cert /etc/pki/CA/cacert.pem \ -in /tmp/webserver.csr \ -out /tmp/webserver.crt \ -days 365 <<EOF 123456 y y EOFChứng chỉ đã ký được lưu tại
/tmp/webserver.crt.
3. Cấu hình HTTPS trên Apache
Sau khi sao chép chứng chỉ và khóa vào thư mục cấu hình:
sudo cp /tmp/webserver.crt /etc/httpd/conf.d/
sudo cp /etc/ssl/private/webserver.key /etc/httpd/conf.d/
Chỉnh sửa tệp /etc/httpd/conf.d/ssl.conf:
SSLCertificateFile /etc/httpd/conf.d/webserver.crtSSLCertificateKeyFile /etc/httpd/conf.d/webserver.key
Mở cổng 443/tcp và khởi động lại dịch vụ:
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload
sudo systemctl restart httpd
Lưu ý: Khi khởi động, hệ thống sẽ yêu cầu nhập mật khẩu khóa riêng tư — điều này có thể tự động hóa bằng cách loại bỏ mật khẩu khỏi khóa (openssl rsa -in webserver.key -out webserver.key.insecure), tuy nhiên cần cân nhắc rủi ro bảo mật.
4. Cấu hình HTTPS trên Nginx
Sau khi dừng Apache và cài đặt Nginx:
sudo systemctl stop httpd
sudo yum install -y nginx
Cập nhật khối server trong /etc/nginx/conf.d/default.conf:
server {
listen 443 ssl http2;
server_name web-server.local;
root /usr/share/nginx/html;
index index.html;
ssl_certificate /etc/httpd/conf.d/webserver.crt;
ssl_certificate_key /etc/httpd/conf.d/webserver.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
}
Thực thi kiểm tra cấu hình và khởi động:
sudo nginx -t
sudo nginx -s reload
5. Cơ chế Thiết lập Kết nối TLS (Handshake)
Quá trình thiết lập kênh bảo mật TLS 1.2/1.3 diễn ra qua bốn bước logic:
- Client Hello: Máy khách gửi danh sách các giao thức mã hóa và nhóm tham số hỗ trợ.
- Server Hello + Certificate: Máy chủ chọn phương án phù hợp và gửi chứng chỉ X.509 kèm khóa công khai.
- Client Key Exchange: Máy khách xác minh chứng chỉ bằng CA root đã tin cậy, sinh khóa phiên (premaster secret), mã hóa bằng khóa công khai máy chủ và gửi đi.
- Change Cipher Spec + Finished: Cả hai bên sinh khóa phiên đầy đủ (master secret), chuyển sang chế độ mã hóa và xác nhận hoàn tất thiết lập.
Ưu điểm của mô hình này là kết hợp cả xác thực danh tính (qua PKI) và hiệu năng cao (sử dụng mã hóa đối xứng cho dữ liệu ứng dụng).