Vấn đề
Người dùng Firefox thường gặp trở ngại khi một trang web sử dụng chuẩn bảo mật lỗi thời. Nếu bạn thấy thông báo SSL_ERROR_WEAK_SERVER_EPHEMERAL_DH_KEY, trình duyệt của bạn đang chặn kết nối để bảo vệ bạn. Nó đã phát hiện máy chủ đang sử dụng các khóa Diffie-Hellman (DH) "export-grade" quá nhỏ—thường là 512 hoặc 768 bit.
Vào những năm 90, các khóa yếu này là yêu cầu pháp lý đối với phần mềm xuất khẩu. Ngày nay, chúng là một lỗ hổng bảo mật nghiêm trọng. Các trình duyệt hiện đại yêu cầu các tham số ít nhất là 1024-bit, nhưng cộng đồng bảo mật coi 2048-bit là mức tối thiểu tuyệt đối để chống lại cuộc tấn công Logjam. Nếu không nâng cấp, kẻ tấn công có khả năng bẻ khóa mã hóa của bạn trong thời gian thực.
Tại sao trình duyệt chặn các khóa này
Quá trình trao đổi Diffie-Hellman cho phép máy chủ và khách truy cập thống nhất một khóa bí mật mà kẻ nghe lén không nhìn thấy được. Tuy nhiên, nếu các số nguyên tố được sử dụng trong quá trình trao đổi này quá nhỏ, chúng sẽ trở nên dễ đoán. Các nhà nghiên cứu đã chỉ ra rằng các số nguyên tố 512-bit có thể bị bẻ khóa trong vòng chưa đầy 8 giờ chỉ với vài trăm đô la. Bằng cách chặn các kết nối này, Firefox đảm bảo dữ liệu riêng tư của bạn không truyền qua một kết nối cực kỳ mong manh.
Bước 1: Tạo các tham số DH mạnh hơn
Việc khắc phục bắt đầu bằng việc tạo một nhóm DH duy nhất có độ bảo mật cao. Chúng tôi khuyên dùng 2048 bit; nó cung cấp khả năng bảo mật tuyệt vời mà không gây tốn tài nguyên CPU như các khóa 4096-bit. Chạy lệnh này trong terminal của bạn:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Lưu ý: Quá trình này tiêu tốn nhiều tài nguyên CPU. Có thể mất từ 1 đến 5 phút tùy thuộc vào phần cứng máy chủ của bạn. Hãy để nó hoàn thành hoàn toàn trước khi sang bước tiếp theo.
Bước 2: Cập nhật cấu hình máy chủ của bạn
Sau khi đã có tệp dhparam.pem, bạn cần trỏ máy chủ web của mình đến tệp đó.
Cách khắc phục cho Nginx
Tìm tệp cấu hình trang web của bạn. Nó thường nằm ở /etc/nginx/sites-available/ hoặc /etc/nginx/conf.d/.
Bên trong khối server cho cổng 443, thêm dòng ssl_dhparam như hiển thị bên dưới:
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
# Yêu cầu Nginx sử dụng các tham số DH mới
ssl_dhparam /etc/ssl/certs/dhparam.pem;
# Sử dụng các giao thức và bộ mã hóa hiện đại
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
}
Kiểm tra cú pháp và tải lại dịch vụ:
sudo nginx -t
sudo systemctl restart nginx
Cách khắc phục cho Apache
Cách thiết lập Apache tùy thuộc vào phiên bản của bạn. Đối với Apache 2.4.8 trở lên, quy trình này khá đơn giản.
**Tùy chọn A: Cách hiện đại (Khuyên dùng)**Thêm chỉ thị này vào bên trong khối <VirtualHost *:443> của bạn:
<VirtualHost *:443>
ServerName yourdomain.com
SSLEngine on
SSLCertificateFile /path/to/cert.crt
SSLCertificateKeyFile /path/to/key.key
# Trỏ Apache đến tệp DH mới của bạn
SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"
</VirtualHost>
Tùy chọn B: Cách cũNếu bạn đang sử dụng phiên bản Apache cũ hơn, bạn có thể chỉ cần thêm các tham số DH vào cuối tệp chứng chỉ của mình:
cat /etc/ssl/certs/dhparam.pem | sudo tee -a /etc/ssl/certs/your_certificate.crt
Khởi động lại Apache để áp dụng các thay đổi:
sudo systemctl restart apache2
Cách khắc phục cho Java / Tomcat
Các phiên bản Java cũ hơn (trước Java 8u121) bị giới hạn DH ở mức 1024-bit. Nếu bạn không thể nâng cấp Java, bạn phải vô hiệu hóa hoàn toàn các bộ mã hóa DHE. Trong tệp server.xml, hãy tìm Connector của bạn và chỉnh sửa thuộc tính ciphers để loại bỏ bất kỳ thứ gì bắt đầu bằng TLS_DHE_. Thay vào đó, hãy ưu tiên TLS_ECDHE_ (Elliptic Curve), vốn nhanh hơn và tránh hoàn toàn vấn đề về tham số DH.
Bước 3: Xác nhận kết quả
Đừng cho rằng nó đã được khắc phục chỉ vì trang lỗi biến mất. Hãy sử dụng các công cụ sau để chắc chắn.
Kiểm tra bằng dòng lệnh
Chạy lệnh OpenSSL này từ máy cục bộ của bạn để xem máy chủ đang cung cấp những gì:
openssl s_client -connect yourdomain.com:443 -cipher "DHE" | grep "Server Temp Key"
Một kết quả khắc phục thành công sẽ trả về: Server Temp Key: DH, 2048 bits.
Kiểm tra trực quan
Truy cập Qualys SSL Labs. Chạy quét tên miền của bạn và cuộn xuống phần "Cipher Suites". Bạn sẽ muốn thấy "DH 2048 bits" và đèn xanh cho bài kiểm tra Logjam.
Các lỗi thường gặp
- Quyền đọc: Nếu Nginx hoặc Apache không khởi động được, hãy kiểm tra xem người dùng dịch vụ (như
www-data) có quyền đọc/etc/ssl/certs/dhparam.pemhay không. - Bẫy 4096-bit: Mặc dù 4096-bit an toàn hơn, nhưng nó làm chậm đáng kể quá trình bắt tay (handshake) ban đầu cho mọi khách truy cập. Đối với 99% các trang web, 2048-bit là sự cân bằng hoàn hảo giữa tốc độ và bảo mật.
- Thiết bị cũ: Nếu bạn phải hỗ trợ Windows XP hoặc các thiết bị Android 2.3 đời cũ, DH 2048-bit có thể làm hỏng kết nối của họ. Trong những trường hợp hiếm hoi đó, chuyển sang các bộ mã hóa ECDHE là một giải pháp thay thế tốt hơn.

