Khi quá trình bắt tay (Handshake) thất bại
Bạn cố gắng truy cập một trang web, nhưng thay vì trang chủ, Chrome hoặc Edge lại hiển thị một màn hình cảnh báo màu xám. Mã lỗi rất rõ ràng: ERR_SSL_VERSION_OR_CIPHER_MISMATCH. Đây không phải là vấn đề với mã nguồn hay kết nối internet của bạn. Về cơ bản, trình duyệt và máy chủ web đã cố gắng thực hiện quá trình "bắt tay" thông qua một giao thức bảo mật, nhưng chúng không tìm thấy ngôn ngữ chung để giao tiếp.
Sự cố này xảy ra ở cấp độ hạ tầng. Nó thường có nghĩa là máy chủ của bạn đang cố gắng sử dụng các tiêu chuẩn bảo mật mà các trình duyệt hiện đại coi là lỗi thời và nguy hiểm.
Tại sao kết nối của bạn bị chặn
Các tiêu chuẩn bảo mật thay đổi rất nhanh. Những gì an toàn cách đây 5 năm thường trở thành lỗ hổng vào ngày hôm nay. Hầu hết các lỗi bắt tay SSL bắt nguồn từ một trong bốn vấn đề sau:
- Các phiên bản TLS cũ: Kể từ năm 2020, các trình duyệt lớn như Chrome 84+ và Firefox đã ngừng hỗ trợ TLS 1.0 và 1.1. Nếu máy chủ của bạn chỉ hỗ trợ các phiên bản này, các trình duyệt hiện đại sẽ từ chối kết nối.
- Bộ mã hóa (Cipher Suites) yếu: Sử dụng các bộ mã hóa cũ như RC4, DES hoặc 3DES là một rủi ro lớn. Trình duyệt hiện đại yêu cầu các bộ mã hóa dựa trên GCM hoặc ChaCha20 để đảm bảo kết nối an toàn.
- Chứng chỉ không khớp: Lỗi này có thể xảy ra nếu tên miền trên chứng chỉ SSL không khớp với URL, hoặc nếu có sự xung đột giữa khóa RSA và ECC (Elliptic Curve Cryptography).
- Cấu hình Cloudflare: Nếu bạn vừa chuyển sang Cloudflare, chứng chỉ Universal SSL của bạn có thể vẫn đang ở trạng thái "Pending Validation" (Đang chờ xác thực). Quá trình này có thể mất từ 15 phút đến 24 giờ.
Bước 1: Kiểm tra cấu hình SSL hiện tại
Trước khi can thiệp vào các tệp cấu hình, hãy kiểm tra xem máy chủ của bạn thực sự đang phát đi thông tin gì. Bạn có thể sử dụng công cụ Qualys SSL Labs để phân tích sâu, hoặc chạy quét nhanh từ terminal bằng nmap:
nmap --script ssl-enum-ciphers -p 443 yourdomain.com
Xem kỹ kết quả đầu ra. Nếu bạn chỉ thấy TLSv1.0 hoặc TLSv1.1 được liệt kê, bạn đã tìm thấy nguyên nhân. Để đáp ứng các yêu cầu bảo mật hiện đại, máy chủ của bạn phải hỗ trợ ít nhất TLSv1.2.
Bước 2: Cập nhật cấu hình máy chủ
Tăng cường bảo mật cho Nginx
Để giải quyết vấn đề này trong Nginx, hãy tìm tệp cấu hình trang web của bạn. Thông thường tệp này nằm trong /etc/nginx/sites-available/. Tìm các dòng ssl_protocols và ssl_ciphers.
Cập nhật chúng để sử dụng các tiêu chuẩn hiện đại sau:
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
# Chỉ cho phép các giao thức bảo mật
ssl_protocols TLSv1.2 TLSv1.3;
# Sử dụng các bộ mã hóa hiện đại, độ bảo mật cao
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers on;
}
Luôn kiểm tra cú pháp trước khi khởi động lại. Chạy lệnh sudo nginx -t, và nếu thành công, hãy tải lại dịch vụ bằng sudo systemctl reload nginx.
Cấu hình Apache
Đối với Apache, bạn cần chỉnh sửa tệp VirtualHost hoặc tệp ssl.conf chung. Đảm bảo rằng bạn đang vô hiệu hóa các giao thức cũ một cách rõ ràng.
# Vô hiệu hóa SSLv3 và TLS 1.0/1.1
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
# Định nghĩa các bộ mã hóa hiện đại dựa trên GCM
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305
SSLHonorCipherOrder on
Áp dụng các thay đổi bằng cách chạy sudo systemctl restart apache2.
Điều chỉnh cài đặt Cloudflare
Nếu trang web của bạn nằm sau Cloudflare, điểm nghẽn có thể nằm ở cài đặt Edge của họ chứ không phải ở máy chủ gốc. Đăng nhập vào bảng điều khiển và điều hướng đến SSL/TLS > Edge Certificates.
Kiểm tra Minimum TLS Version. Nếu nó được đặt thành 1.3, các thiết bị cũ (như Android 4.4 hoặc IE 11) sẽ không thể kết nối. Đặt mức này thành 1.2 thường là lựa chọn tối ưu cho cả bảo mật và khả năng tương thích. Ngoài ra, hãy đảm bảo trạng thái Universal SSL của bạn không bị kẹt ở "Pending".
Bước 3: Xác minh kết quả
Sau khi cập nhật máy chủ, hãy sử dụng openssl để kiểm tra quá trình bắt tay một cách thủ công. Cách này bỏ qua bộ nhớ đệm của trình duyệt và cung cấp cho bạn dữ liệu thô.
openssl s_client -connect yourdomain.com:443 -tls1_2
Một kết nối thành công sẽ hiển thị chuỗi chứng chỉ và chi tiết bộ mã hóa cụ thể. Nếu bạn thấy alert handshake failure, máy chủ vẫn đang từ chối các nỗ lực kết nối.
Một mẹo cuối cùng: hãy xóa bộ nhớ đệm trình duyệt hoặc sử dụng cửa sổ Ẩn danh. Các trình duyệt thường ghi nhớ trạng thái thất bại của một lần bắt tay bảo mật. Một lần làm mới trang đơn giản có thể không đủ để xóa lỗi cũ.

