Thông báo lỗi
Bạn có thể đã thấy cảnh báo này khi kiểm tra cấu hình Nginx hoặc khởi động lại dịch vụ. Nó thường hiển thị như sau trong terminal của bạn:
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/ssl/certs/example.com.crt"
Trang web của bạn vẫn sẽ tải qua HTTPS và Nginx vẫn khởi động mà không gặp lỗi. Tuy nhiên, OCSP Stapling—một tính năng giúp tăng tốc quá trình bắt tay SSL—hiện đã bị vô hiệu hóa. Nếu không có nó, trình duyệt của mỗi khách truy cập phải liên hệ với Tổ chức phát hành chứng chỉ (CA) để kiểm tra xem chứng chỉ của bạn có bị thu hồi hay không. Bước bổ sung này có thể làm tăng độ trễ từ 200ms đến 500ms cho lần tải trang đầu tiên.
Nguyên nhân gốc rễ
OCSP (Online Certificate Status Protocol) Stapling cho phép máy chủ của bạn chứng minh chứng chỉ của nó là hợp lệ mà không cần trình duyệt phải thực hiện các công việc nặng nhọc. Để thực hiện kiểm tra này, Nginx cần thấy toàn bộ đường dẫn từ chứng chỉ tên miền của bạn đến Root CA.
Cảnh báo này được kích hoạt vì tệp ssl_certificate của bạn chỉ chứa chứng chỉ công khai của tên miền. Nó đang thiếu Chứng chỉ trung gian (Intermediate Certificate). Tệp trung gian này đóng vai trò là cầu nối giữa trang web của bạn và Root CA đáng tin cậy. Nếu không có nó, Nginx không thể xác minh "nhà phát hành" (issuer) và đành phải bỏ qua tính năng stapling.
Cách khắc phục
Bạn có hai cách để giải quyết vấn đề này. Phương pháp đầu tiên là tiêu chuẩn chung và hoạt động tốt nhất cho hầu hết các thiết lập.
Cách 1: Tạo chứng chỉ chuỗi đầy đủ (Khuyên dùng)
Hợp nhất chứng chỉ tên miền và chứng chỉ trung gian của bạn vào một tệp duy nhất. Thứ tự ở đây rất quan trọng. Chứng chỉ tên miền của bạn phải xuất hiện trước, sau đó mới đến chứng chỉ trung gian.
- Tìm các tệp chứng chỉ của bạn. Thông thường, bạn sẽ có
your_domain.crtvà một tệpbundle.crt(hoặcintermediate.crt). - Kết hợp chúng bằng lệnh
cat:
cat your_domain.crt intermediate.crt > your_domain_fullchain.crt
Nếu CA của bạn cung cấp nhiều tệp trung gian (ví dụ: intermediate1.crt và intermediate2.crt), hãy xếp chồng chúng theo thứ tự: Tên miền -> Trung gian 1 -> Trung gian 2.
- Cập nhật cấu hình trang web Nginx của bạn (thường nằm trong
/etc/nginx/sites-available/):
server {
listen 443 ssl;
server_name example.com;
# Trỏ đến tệp kết hợp mới của bạn
ssl_certificate /etc/ssl/certs/your_domain_fullchain.crt;
ssl_certificate_key /etc/ssl/private/your_domain.key;
ssl_stapling on;
ssl_stapling_verify on;
}
Cách 2: Sử dụng chỉ thị ssl_trusted_certificate
Nếu bạn muốn giữ các tệp riêng biệt, hãy sử dụng chỉ thị này để cho Nginx biết chính xác nơi lưu trữ chứng chỉ của nhà phát hành. Điều này thường thấy trong các môi trường mà chứng chỉ được quản lý bởi các tập lệnh tự động tách riêng chứng chỉ đầu cuối và chuỗi.
- Giữ
ssl_certificatetrỏ đến chứng chỉ tên miền của bạn. - Thêm chỉ thị
ssl_trusted_certificatetrỏ đến gói CA của bạn:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
# Xác định rõ ràng nhà phát hành cho OCSP
ssl_trusted_certificate /etc/ssl/certs/intermediate_bundle.crt;
ssl_stapling on;
ssl_stapling_verify on;
# Sử dụng DNS của Google hoặc Cloudflare để tra cứu OCSP
resolver 8.8.8.8 1.1.1.1 valid=300s;
resolver_timeout 5s;
}
Kiểm tra
Luôn kiểm tra lại công việc trước khi tải lại cấu hình. Chạy kiểm tra cú pháp Nginx:
sudo nginx -t
Nếu cảnh báo biến mất, bạn sẽ thấy thông báo thành công. Bây giờ, hãy tải lại Nginx để áp dụng các thay đổi:
sudo systemctl reload nginx
Để xác nhận OCSP stapling đang hoạt động, hãy sử dụng lệnh OpenSSL này:
openssl s_client -connect example.com:443 -status -servername example.com | grep -A 17 "OCSP response:"
Tìm kiếm trong kết quả đầu ra dòng OCSP Response Status: successful (0x0). Nếu dòng này xuất hiện, máy chủ của bạn đã thực hiện stapling trạng thái thu hồi thành công.
Cách phòng ngừa
- Chuyển sang Fullchain: Nếu bạn sử dụng Let's Encrypt với Certbot, hãy ngừng sử dụng
cert.pem. Luôn sử dụngfullchain.pemtrong cấu hình Nginx của bạn. - Kiểm tra tệp Zip từ nhà cung cấp: Khi tải xuống chứng chỉ từ Namecheap hoặc DigiCert, hãy tìm tệp "bundle" hoặc "chain". Đừng bỏ qua nó.
- Tự động hóa đúng cách: Nếu bạn sử dụng Ansible hoặc Terraform, hãy đảm bảo các tập lệnh triển khai của bạn tự động nối chứng chỉ tên miền và gói CA thành một tệp duy nhất.

