Cách khắc phục nhanh
Lỗi này là cách trình duyệt thông báo rằng nó không nhận diện được thực thể đã cấp chứng chỉ bảo mật cho trang web. Bạn thường có thể khắc phục bằng các bước sau:
- Các trang web thực tế (Production): Thay thế các chứng chỉ tự ký (self-signed) bằng chứng chỉ hợp lệ được ký bởi CA từ các nhà cung cấp như Let's Encrypt.
- Phát triển cục bộ (Local Development): Sử dụng
mkcertđể tạo các chứng chỉ mà máy cục bộ của bạn thực sự tin cậy. - Người dùng cuối: Kiểm tra xem đồng hồ hệ thống có chính xác đến từng phút hay không. Ngày giờ sai thường khiến các chứng chỉ hoàn toàn hợp lệ trông như đã hết hạn hoặc không hợp lệ.
Tại sao lỗi này xảy ra
Khi bạn tải một trang web qua HTTPS, máy chủ sẽ gửi một chứng chỉ để chứng minh danh tính của mình. Trình duyệt sau đó sẽ kiểm tra chứng chỉ này đối với một "Kho lưu trữ tin cậy" (Trust Store) tích hợp sẵn, chứa các Tổ chức phát hành chứng chỉ (CAs) đã được xác minh như DigiCert hoặc Sectigo. Nếu tổ chức phát hành không có trong danh sách đó, Chrome hoặc Edge sẽ chặn kết nối với cảnh báo NET::ERR_CERT_AUTHORITY_INVALID.
Đây là những nguyên nhân thường gây ra màn hình đỏ:
- Chứng chỉ tự ký (Self-signed certificates): Bạn đã tự tạo chứng chỉ cho riêng mình thay vì nhận một chứng chỉ từ một CA đáng tin cậy.
- Chuỗi chứng chỉ bị hỏng (Broken certificate chains): Máy chủ quên gửi chứng chỉ trung gian (intermediate certificate) kết nối trang web của bạn với CA gốc (root CA).
- Hệ điều hành cũ: Các hệ thống cũ hơn, như Windows 7 hoặc Android 7.1.1, có thể thiếu các chứng chỉ gốc hiện đại cần thiết cho các tiêu chuẩn HTTPS mới hơn.
Cách 1: Chuyển sang Let's Encrypt cho môi trường Production
Các trang web công khai không bao giờ nên sử dụng chứng chỉ tự ký. Chúng gây nhầm lẫn cho người dùng và ảnh hưởng xấu đến SEO của bạn. Thay vào đó, hãy sử dụng Certbot để cài đặt chứng chỉ miễn phí, tự động từ Let's Encrypt. Quá trình này mất chưa đầy năm phút.
Trên máy chủ Ubuntu chạy Nginx, hãy sử dụng các lệnh sau:
sudo apt update
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
Certbot sẽ tự động sửa đổi cấu hình Nginx của bạn. Nó thêm các đường dẫn cần thiết cho chuỗi chứng chỉ đầy đủ (full certificate chain), đảm bảo trình duyệt có thể xác minh đường dẫn ngược lại Root CA.
Cách 2: Phát triển cục bộ chuyên nghiệp với mkcert
Nhiều nhà phát triển bỏ qua các lỗi SSL trên localhost bằng cách nhấp vào "Nâng cao -> Tiếp tục". Đây là một thói quen xấu có thể che giấu các lỗi cấu hình thực tế. Các chứng chỉ tự ký OpenSSL tiêu chuẩn không được tin cậy theo mặc định. Để khắc phục điều này một cách đúng đắn, hãy sử dụng mkcert.
Đầu tiên, hãy cài đặt công cụ. Trên macOS sử dụng Homebrew:
brew install mkcert
brew install nss # Cần thiết nếu bạn sử dụng Firefox
Tiếp theo, thiết lập CA cục bộ trên máy của bạn:
mkcert -install
Cuối cùng, tạo chứng chỉ cho dự án của bạn:
mkcert localhost dev.local 127.0.0.1
Lệnh này tạo ra hai tệp: localhost+2.pem và localhost+2-key.pem. Hãy cấu hình máy chủ web cục bộ của bạn để sử dụng chúng. Trình duyệt của bạn bây giờ sẽ hiển thị biểu tượng ổ khóa xanh hợp lệ khi kiểm thử cục bộ.
Cách 3: Sửa lỗi chuỗi chứng chỉ trung gian
Một sai lầm phổ biến là chỉ cung cấp chứng chỉ "lá" (leaf certificate) trong cấu hình máy chủ. Mặc dù một số trình duyệt lưu bộ nhớ đệm cho các chứng chỉ trung gian, nhưng nhiều trình duyệt sẽ báo lỗi nếu máy chủ không cung cấp chuỗi đầy đủ.
Nếu bạn sử dụng Nginx, hãy kiểm tra đường dẫn ssl_certificate của bạn. Nó phải trỏ đến fullchain.pem, chứ không phải cert.pem. Tệp chuỗi đầy đủ chứa chứng chỉ của bạn, theo sau là các chứng chỉ trung gian của CA.
server {
listen 443 ssl;
server_name example.com;
# Sử dụng fullchain.pem, không phải cert.pem
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
}
Cách 4: Cập nhật kho lưu trữ tin cậy đã lỗi thời của máy khách
Đôi khi máy chủ hoàn hảo, nhưng máy tính của khách truy cập đã quá cũ. Một ví dụ nổi tiếng là việc hết hạn của IdentTrust DST Root CA X3 vào tháng 9 năm 2021. Điều này đã khiến hàng triệu thiết bị cũ đột ngột gặp lỗi CERT_AUTHORITY_INVALID.
- Người dùng Windows: Chạy Windows Update. Việc này buộc hệ thống phải cập nhật lại danh sách các chứng chỉ gốc đáng tin cậy.
- Người dùng Linux: Cài đặt lại gói chứng chỉ CA để đảm bảo bạn có bản cập nhật mới nhất:
sudo apt-get install --reinstall ca-certificates sudo update-ca-certificates
- **Người dùng macOS:** Nếu bạn buộc phải tin tưởng một chứng chỉ tùy chỉnh cụ thể, hãy kéo tệp `.crt` vào **Keychain Access**. Nhấp đúp vào nó và thay đổi cài đặt tin cậy thành **Always Trust** (Luôn tin tưởng).
## Cách xác minh việc khắc phục
Tránh chỉ kiểm tra trên trình duyệt chính của bạn, vì dữ liệu được lưu trong bộ nhớ đệm có thể gây nhầm lẫn. Hãy sử dụng dòng lệnh để có câu trả lời chính xác nhất.
**Kiểm tra với OpenSSL:**
openssl s_client -connect yourdomain.com:443 -showcerts
Cuộn xuống cuối kết quả đầu ra. Bạn cần thấy dòng `Verification: OK`. Nếu bạn thấy `Verification error: self signed certificate`, máy chủ của bạn vẫn chưa gửi đúng chuỗi chứng chỉ.
**Kiểm tra với Curl:**
curl -vI https://yourdomain.com
Nếu quá trình bắt tay (handshake) hoàn tất mà không có lỗi SSL, cấu hình của bạn hiện đã tuân thủ tiêu chuẩn và an toàn.
## Tài liệu tham khảo thêm
- [Giải thích về việc hết hạn Root CA năm 2021](https://letsencrypt.org/docs/dst-root-ca-x3-expiration-september-2021/)
- [Tài liệu mkcert trên GitHub](https://github.com/FiloSottile/mkcert)
- [Hướng dẫn HTTPS chính thức của Nginx](https://nginx.org/en/docs/http/configuring_https_servers.html)

