Chứng chỉ SSL giờ không còn là hạng mục “nên có”. Trình duyệt gắn nhãn cảnh báo cho trang không mã hoá, biểu mẫu bị chặn, và mọi tính năng hiện đại của trình duyệt đều yêu cầu kết nối an toàn. Let’s Encrypt cấp chứng chỉ miễn phí, tự động, nhưng chỉ tự động khi bạn cấu hình đúng ngay từ đầu.
Bài này giải thích cơ chế đằng sau — giao thức ACME, các kiểu xác minh, chu kỳ 90 ngày — rồi mới tới thao tác. Hiểu cơ chế là cách duy nhất để xử lý được lúc gia hạn tự động im lặng thất bại lúc 2 giờ sáng.
ACME: chứng chỉ được cấp bằng cách nào
Let’s Encrypt là một tổ chức cấp chứng chỉ hoạt động hoàn toàn tự động qua giao thức ACME (Automatic Certificate Management Environment). Không có biểu mẫu để điền, không có nhân viên duyệt. Trình tự luôn là:
- Phần mềm trên máy bạn (ACME client) tạo một cặp khoá tài khoản và đăng ký với tổ chức cấp chứng chỉ.
- Bạn yêu cầu chứng chỉ cho một danh sách tên miền.
- Tổ chức cấp chứng chỉ trả về các thử thách (challenge) — mỗi tên miền một thử thách — để chứng minh bạn có quyền kiểm soát tên miền đó.
- Client đáp ứng thử thách, rồi báo đã sẵn sàng.
- Máy chủ của tổ chức cấp chứng chỉ đi kiểm tra từ nhiều điểm mạng khác nhau. Đạt thì ký và trả về chứng chỉ.
Điểm mấu chốt: xác minh là quyền kiểm soát tên miền, không phải danh tính doanh nghiệp. Đây là chứng chỉ loại DV. Nó mã hoá đường truyền và xác nhận bạn đang nói chuyện đúng với tên miền đó, chứ không chứng thực công ty phía sau là ai.
HTTP-01 và DNS-01: chọn kiểu xác minh nào
| HTTP-01 | DNS-01 | |
|---|---|---|
| Bạn phải làm gì | Đặt một tệp tạm tại /.well-known/acme-challenge/ |
Tạo bản ghi TXT tên _acme-challenge |
| Điều kiện | Máy chủ phải mở cổng 80 và truy cập được từ Internet | Có quyền sửa DNS, tốt nhất là sửa được bằng API |
| Cấp được chứng chỉ ký tự đại diện | Không | Có |
| Dùng được khi máy chủ nằm sau tường lửa | Không | Có |
| Độ khó tự động hoá | Rất dễ, client làm hết | Cần trình cắm tương ứng với nơi quản lý DNS |
Còn một kiểu thứ ba là TLS-ALPN-01, xác minh ngay trong quá trình bắt tay TLS trên cổng 443. Nó hữu ích khi cổng 80 bị chặn hoàn toàn, nhưng cần phần mềm máy chủ hỗ trợ và ít khi cần tới trong tình huống thông thường.
Quy tắc chọn cho gọn:
- Website bình thường, có IP công khai, mở cổng 80: dùng HTTP-01.
- Cần chứng chỉ ký tự đại diện dạng
*.tenmien.com: bắt buộc DNS-01, không có ngoại lệ. - Máy chủ nội bộ, môi trường thử nghiệm, hoặc muốn cấp chứng chỉ trước khi trỏ tên miền: DNS-01.
Lưu ý về chứng chỉ ký tự đại diện: *.tenmien.com chỉ phủ một cấp tên miền con. Nó bao blog.tenmien.com nhưng không bao a.b.tenmien.com, và cũng không bao chính tenmien.com — muốn đủ thì phải liệt kê cả hai trong cùng một chứng chỉ.
Cách nhanh nhất: hosting có sẵn cơ chế cấp tự động
Nếu bạn dùng hosting chia sẻ với cPanel hoặc bảng điều khiển tương đương, gần như chắc chắn đã có sẵn tính năng cấp chứng chỉ tự động. Vào mục SSL/TLS Status, chọn tên miền, chạy lệnh cấp tự động. Toàn bộ phần gia hạn do máy chủ lo.
Điều kiện để nó chạy được, và cũng là ba lý do phổ biến khiến nó thất bại:
- Tên miền phải đang phân giải về đúng IP máy chủ đó. Chưa trỏ xong thì thử thách không thể đạt. Xem Hướng dẫn trỏ tên miền về Hosting cPanel trước khi bấm cấp chứng chỉ.
- Đường dẫn
/.well-known/acme-challenge/phải truy cập được. Một quy tắc chuyển hướng “bắt tất cả” trong.htaccesshoặc một trình cắm bảo mật chặn thư mục ẩn là đủ để phá hỏng bước này. - Tên miền con nào không phân giải về máy chủ thì phải loại khỏi danh sách, vì một tên hỏng làm hỏng cả yêu cầu.
Cấp bằng certbot trên máy chủ tự quản
Certbot là client chính thức, phổ biến nhất trên Linux. Hai kiểu dùng:
# Kiểu 1: certbot tự sửa cấu hình máy chủ web
sudo certbot --nginx -d tenmien.com -d www.tenmien.com
# Kiểu 2: chỉ lấy chứng chỉ, bạn tự khai báo trong cấu hình
sudo certbot certonly --webroot -w /var/www/tenmien.com/public
-d tenmien.com -d www.tenmien.com
# Thử nghiệm trước bằng môi trường staging để không đụng giới hạn cấp phát
sudo certbot certonly --staging --webroot -w /var/www/tenmien.com/public -d tenmien.com
# Xem các chứng chỉ đang có và ngày hết hạn
sudo certbot certificates
Chứng chỉ được lưu ở /etc/letsencrypt/live/tenmien.com/. Trong cấu hình máy chủ web hãy trỏ tới fullchain.pem (chứng chỉ của bạn kèm chuỗi trung gian) và privkey.pem (khoá riêng). Dùng nhầm cert.pem thay cho fullchain.pem là lỗi kinh điển: trình duyệt máy tính vẫn xanh, nhưng một số ứng dụng di động và công cụ dòng lệnh báo chuỗi chứng chỉ không đầy đủ.
Luôn trỏ tới đường dẫn trong thư mục live/, đừng trỏ vào tệp trong archive/. Thư mục live/ là các liên kết luôn chỉ vào bản mới nhất, nên sau khi gia hạn bạn không phải sửa cấu hình.
acme.sh khi cần DNS-01 tự động
acme.sh là client viết bằng shell, không phụ thuộc môi trường ngôn ngữ khác, và mạnh nhất ở chỗ hỗ trợ rất nhiều nhà quản lý DNS qua API — nghĩa là nó tự tạo và tự xoá bản ghi TXT giúp bạn.
# Cấp chứng chỉ ký tự đại diện bằng DNS-01 (thay dns_xxx bằng trình cắm tương ứng) acme.sh --issue --dns dns_xxx -d tenmien.com -d '*.tenmien.com' # Cài chứng chỉ vào đúng chỗ và nạp lại dịch vụ sau mỗi lần gia hạn acme.sh --install-cert -d tenmien.com --key-file /etc/ssl/tenmien/privkey.pem --fullchain-file /etc/ssl/tenmien/fullchain.pem --reloadcmd "systemctl reload nginx"
Nếu nơi quản lý DNS của bạn không có API, vẫn có chế độ tạo bản ghi TXT thủ công — nhưng khi đó bạn phải làm lại bằng tay ở mỗi kỳ gia hạn. Với chứng chỉ 90 ngày, cách thủ công chỉ nên dùng một lần cho tình huống đặc biệt.
Chu kỳ 90 ngày và chuyện gia hạn tự động
Chứng chỉ Let’s Encrypt có hiệu lực 90 ngày. Đây là lựa chọn có chủ đích: vòng đời ngắn buộc mọi người phải tự động hoá, và giới hạn thiệt hại nếu khoá riêng bị lộ. Thông lệ là gia hạn khi còn khoảng 30 ngày, tức vào khoảng ngày thứ 60 — như vậy bạn còn cả tháng đệm để xử lý nếu có trục trặc.
Cả certbot lẫn acme.sh đều tự cài sẵn tác vụ định kỳ khi cài đặt, và lệnh gia hạn chỉ thực sự làm việc khi chứng chỉ đã tới ngưỡng. Vì vậy chạy lệnh gia hạn hằng ngày là bình thường và không hề lãng phí.
# Diễn tập gia hạn: chạy toàn bộ quy trình nhưng không thay chứng chỉ thật sudo certbot renew --dry-run # Kiểm tra tác vụ định kỳ có đang bật không systemctl list-timers | grep -i certbot # Xem ngày hết hạn thực tế mà máy chủ đang phục vụ echo | openssl s_client -servername tenmien.com -connect tenmien.com:443 2>/dev/null | openssl x509 -noout -dates
Câu lệnh cuối quan trọng hơn hai câu trên: nó hỏi thẳng cổng 443 xem chứng chỉ đang được phục vụ hết hạn ngày nào. Tình huống hay gặp nhất không phải là gia hạn thất bại, mà là gia hạn thành công nhưng dịch vụ chưa được nạp lại nên vẫn giữ chứng chỉ cũ trong bộ nhớ. Luôn khai báo lệnh nạp lại dịch vụ trong móc sau gia hạn.
Đừng trông chờ vào email nhắc hết hạn từ bên cấp chứng chỉ. Hãy tự đặt một phép giám sát định kỳ kiểm tra số ngày còn lại và báo cho bạn khi xuống dưới ngưỡng — đó là cách duy nhất bạn biết trước thay vì biết khi khách gọi điện.
Bảy lỗi khiến việc cấp hoặc gia hạn thất bại
- Cổng 80 bị đóng. HTTP-01 cần cổng 80. Bạn có thể chuyển hướng toàn bộ sang HTTPS, vì quy trình xác minh đi theo chuyển hướng, nhưng không được chặn hẳn cổng 80 ở tường lửa.
- Chặn nhầm thư mục thử thách. Quy tắc viết lại đường dẫn của ứng dụng nuốt luôn
/.well-known/acme-challenge/. Hãy thêm ngoại lệ cho đường dẫn này trước mọi quy tắc khác. - Chặn theo vùng địa lý. Máy chủ xác minh đi từ nhiều điểm trên thế giới. Nếu bạn chỉ cho phép truy cập từ Việt Nam, phần lớn các điểm kiểm tra sẽ bị chặn và thử thách trượt.
- Bản ghi DNS chưa lan truyền. Với DNS-01, TTL cao khiến bản ghi TXT mới chưa thấy được lúc kiểm tra. Hạ TTL của vùng DNS xuống thấp trước khi tự động hoá.
- Đụng giới hạn cấp phát. Mỗi tên miền có hạn mức số lần cấp trong một khoảng thời gian. Khi đang thử cấu hình, luôn dùng môi trường staging; chỉ chuyển sang thật khi đã chạy trơn.
- Đồng hồ hệ thống sai. Lệch giờ nhiều làm chứng chỉ bị coi là chưa có hiệu lực hoặc đã hết hạn. Bật đồng bộ thời gian trên máy chủ.
- Bật HSTS quá sớm. HSTS ra lệnh cho trình duyệt chỉ được kết nối bằng HTTPS trong khoảng thời gian dài. Bật khi chứng chỉ chưa ổn định là tự khoá mình ra ngoài. Hãy chạy HTTPS trơn tru vài tuần rồi mới bật, và bắt đầu bằng thời hạn ngắn.
Sau khi có chứng chỉ thì làm gì tiếp
- Chuyển hướng toàn bộ HTTP sang HTTPS bằng mã 301, trừ đường dẫn thử thách ACME.
- Soát nội dung hỗn hợp: ảnh, tệp CSS và JavaScript còn gọi bằng
http://sẽ làm mất biểu tượng an toàn. Công cụ dành cho nhà phát triển của trình duyệt liệt kê đủ danh sách này. - Kiểm tra chuỗi chứng chỉ bằng một công cụ đánh giá cấu hình TLS trực tuyến, xem có thiếu chứng chỉ trung gian không.
- Đặt giám sát ngày hết hạn cho mọi tên miền, kể cả tên miền phụ ít dùng — chúng chính là những cái hết hạn mà không ai biết.
- Có HTTPS rồi thì tính tiếp tới chuyện chịu tải và chống lạm dụng: xem Kỹ thuật chống DDoS cơ bản khi quản trị Web.
Kết
Let’s Encrypt cấp chứng chỉ DV miễn phí qua giao thức ACME, xác minh bằng HTTP-01 hoặc DNS-01, hiệu lực 90 ngày và mặc định là phải tự động hoá. Chọn HTTP-01 cho website thông thường, DNS-01 khi cần chứng chỉ ký tự đại diện hoặc máy chủ không lộ ra Internet. Việc quan trọng nhất không phải lần cấp đầu tiên mà là chứng minh được rằng lần gia hạn thứ hai sẽ tự chạy: hãy diễn tập gia hạn, khai báo lệnh nạp lại dịch vụ, và giám sát ngày hết hạn từ bên ngoài.
Đang tìm tên miền cho dự án mới và muốn chạy HTTPS ngay từ ngày đầu? Tra và đăng ký tại ivi.vn/search, sửa bản ghi DNS ngay trong dashboard rồi cấp chứng chỉ theo đúng các bước ở trên.
