Hướng dẫn cài SSL cho Nginx trên Ubuntu bằng Let’s Encrypt và Certbot

Website đã chạy bằng HTTP nhưng chưa có HTTPS thì dữ liệu truyền giữa trình duyệt và máy chủ chưa được mã hóa bằng TLS. Bạn có thể cài SSL miễn phí cho VPS bằng Certbot để yêu cầu chứng chỉ miễn phí từ Let’s Encrypt và tự động cập nhật cấu hình website. Bài viết này hướng dẫn kiểm tra điều kiện đầu vào, cấp chứng chỉ, chuyển hướng HTTP sang HTTPS và xác nhận khả năng gia hạn sau khi cài đặt.

Điều kiện trước khi cài SSL cho Nginx

Hướng dẫn dùng Ubuntu 22.04/24.04 LTS, Nginx cài trực tiếp trên máy chủ và tài khoản có quyền sudo. Các ví dụ dùng example.com và www.example.com; hãy thay bằng tên miền thực tế. Nếu Nginx chạy trong Docker hoặc do control panel quản lý, cách triển khai có thể khác. Bạn có thể tham khảo bài cài SSL miễn phí cho VPS để chọn phương pháp phù hợp.

Kiểm tra DNS và cổng 80/443

Bản ghi A phải trỏ về IPv4 công khai của VPS. Nếu có bản ghi AAAA, IPv6 đó cũng phải dẫn đúng đến máy chủ.

				
					dig +short A example.com
dig +short AAAA example.com
dig +short A www.example.com
dig +short AAAA www.example.com
				
			

Đừng chỉ kiểm tra IPv4. Let’s Encrypt ưu tiên IPv6 khi tên miền có cả hai loại địa chỉ, nên một bản ghi AAAA trỏ về máy chủ cũ có thể làm xác thực thất bại dù IPv4 vẫn bình thường. Hãy sửa hoặc xóa bản ghi đó.

Tiếp theo, kiểm tra từ một máy khác ngoài VPS:

				
					curl -I http://example.com
curl -I http://www.example.com
				
			
Kiểm tra bản ghi DNS A bằng lệnh dig và phản hồi HTTP của Nginx bằng lệnh curl trên Ubuntu
Kiểm tra bản ghi DNS A bằng lệnh dig và phản hồi HTTP của Nginx bằng lệnh curl trên Ubuntu

Website phải mở đúng nội dung. Nếu thấy trang mặc định của Nginx, hãy sửa cấu hình tên miền trước khi cấp chứng chỉ.

Bài dùng xác thực HTTP-01 qua cổng TCP 80, nên cổng này phải mở. Phương pháp này không cấp được chứng chỉ wildcard (*.example.com); trường hợp đó cần DNS-01. Nếu dùng UFW:

				
					sudo ufw status
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
				
			
Mở cổng 80 và 443 trên tường lửa UFW Ubuntu để xác thực Let's Encrypt và chạy HTTPS
Mở cổng 80 và 443 trên tường lửa UFW Ubuntu để xác thực Let’s Encrypt và chạy HTTPS

Hãy kiểm tra cả firewall trong trang quản trị VPS hoặc cloud. Nếu định bật UFW, phải cho phép cổng SSH trước để khỏi mất quyền truy cập. Nếu dùng Cloudflare ở chế độ proxy, DNS công khai sẽ trả IP của Cloudflare, nên cần bảo đảm yêu cầu xác thực không bị CDN hoặc WAF chặn.

Kiểm tra Nginx và sao lưu cấu hình

				
					nginx -v
sudo systemctl status nginx --no-pager
sudo nginx -t
				
			
Nginx phải đang chạy và nginx -t phải thành công. Trong cấu hình website, server_name cần chứa đúng tên miền:

server_name example.com www.example.com;

Dùng sudo nginx -T để xem toàn bộ cấu hình đang nạp, hữu ích khi máy chủ có nhiều website. Trước khi để Certbot chỉnh sửa, hãy sao lưu:

sudo cp -a /etc/nginx “/root/nginx-before-ssl-$(date +%Y%m%d-%H%M%S)”

Xem Thêm  Hướng Dẫn Đăng Ký VPS Từ A-Z Với 5 Bước Đơn Giản Trong 5 Phút
Kiểm tra cú pháp cấu hình bằng lệnh nginx -t và tạo bản sao lưu thư mục /etc/nginx trên Ubuntu
Kiểm tra cú pháp cấu hình bằng lệnh nginx -t và tạo bản sao lưu thư mục /etc/nginx trên Ubuntu

Cách cài SSL Nginx bằng Let’s Encrypt và Certbot

Quy trình dùng Certbot qua Snap, cách được dự án Certbot khuyến nghị.

Bước 1: Cài Certbot và kiểm tra plugin Nginx

Kiểm tra máy đã có Certbot chưa:

				
					command -v certbot
				
			

Nếu đã có, hãy xác định cách cài hiện tại, tránh cài chồng bản Snap lên bản APT. Nếu chưa có:

				
					sudo apt update
sudo apt install snapd
sudo snap install --classic certbot
/snap/bin/certbot --version
sudo /snap/bin/certbot plugins
				
			

Kết quả phải có plugin nginx. Với bản Snap, bạn không cần cài thêm python3-certbot-nginx.

Cài đặt Certbot bằng Snap trên Ubuntu và kiểm tra danh sách plugin hỗ trợ Nginx
Cài đặt Certbot bằng Snap trên Ubuntu và kiểm tra danh sách plugin hỗ trợ Nginx

Bước 2: Cấp và cài chứng chỉ

Nếu dùng cả tên miền chính và www:

				
					sudo /snap/bin/certbot --nginx \
-d example.com \
-d www.example.com \
--redirect
				
			
Cài SSL Nginx trên Ubuntu bằng lệnh certbot --nginx để nhận chứng chỉ miễn phí từ Let's Encrypt
Cài SSL Nginx trên Ubuntu bằng lệnh certbot –nginx để nhận chứng chỉ miễn phí từ Let’s Encrypt

Nếu chỉ dùng tên miền chính, bỏ dòng -d www.example.com. Trong đó –nginx dùng plugin Nginx để xác thực và cài chứng chỉ, -d khai báo từng tên miền, còn –redirect yêu cầu chuyển hướng HTTP sang HTTPS.

Lần đầu chạy, hãy làm theo lời nhắc để nhập email và đồng ý điều khoản. Chỉ thêm www khi tên này đã có DNS và được Nginx phục vụ đúng, vì nếu một tên không xác thực được, cả yêu cầu có thể thất bại. Lưu ý https://www.example.com vẫn cần chứng chỉ hợp lệ cho www, kể cả khi bạn chuyển nó về tên miền không www.

Kiểm tra chứng chỉ đã lưu:

				
					sudo /snap/bin/certbot certificates
				
			
Kiểm tra danh sách chứng chỉ SSL Let's Encrypt, ngày hết hạn và đường dẫn file bằng lệnh certbot certificates
Kiểm tra danh sách chứng chỉ SSL Let’s Encrypt, ngày hết hạn và đường dẫn file bằng lệnh certbot certificates

Bước 3: Rà soát cấu hình HTTPS

Mở file cấu hình website và đối chiếu các chỉ thị Certbot vừa thêm:

				
					listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
				
			

Đây chỉ là phần cần đối chiếu, đừng thay thế toàn bộ khối website và hãy giữ nguyên root, location, PHP-FPM hoặc proxy_pass. Dùng đúng đường dẫn từ certbot certificates, vì thư mục thực tế có thể có hậu tố như example.com-0001. Không nới quyền khóa riêng để xử lý lỗi truy cập file.

Nếu bạn có chỉnh tay, kiểm tra rồi mới nạp lại:

				
					sudo nginx -t
sudo systemctl reload nginx
				
			
Cấu hình khối server HTTPS cổng 443 và chuyển hướng 301 HTTP sang HTTPS do Certbot tự động thêm vào Nginx
Cấu hình khối server HTTPS cổng 443 và chuyển hướng 301 HTTP sang HTTPS do Certbot tự động thêm vào Nginx

Kiểm tra website sau khi cài SSL

Mở website bằng HTTPS và xác nhận chứng chỉ đúng tên miền, còn hiệu lực, không có cảnh báo. Sau đó chạy:

				
					curl -I https://example.com
curl -I http://example.com
curl -IL --max-redirs 10 http://example.com
				
			
Kiểm tra chuyển hướng 301 từ HTTP sang HTTPS trên Nginx bằng lệnh curl -IL trên Ubuntu
Kiểm tra chuyển hướng 301 từ HTTP sang HTTPS trên Nginx bằng lệnh curl -IL trên Ubuntu

Lệnh thứ hai phải trả về chuyển hướng (thường là 301) với Location dẫn đến URL HTTPS. Lệnh thứ ba phải kết thúc ở đúng website. Đừng dùng tùy chọn -k vì nó bỏ qua việc xác minh chứng chỉ.

Nếu dùng CDN, bạn có thể kiểm tra trực tiếp Nginx trên VPS bằng cách chỉ định IP gốc:

				
					curl -I --resolve example.com:443:203.0.113.10 https://example.com
				
			

Thay 203.0.113.10 bằng IP VPS. Cuối cùng, hãy thử trang chủ, một trang nội dung, đăng nhập và các biểu mẫu để chắc chắn ảnh, CSS và JavaScript đều tải bình thường.

Các lỗi thường gặp khi cài SSL cho Nginx

Certbot xác thực thất bại

Dấu hiệuNên kiểm tra
NXDOMAINBản ghi DNS, tên miền gõ sai
Connection refusedNginx có chạy và nghe cổng 80 không
TimeoutFirewall, định tuyến, khả năng truy cập từ Internet
UnauthorizedSai máy chủ, sai khối website, CDN/WAF, chuyển hướng
Chỉ www lỗiDNS và server_name của www
IPv4 ổn nhưng vẫn lỗiBản ghi AAAA và IPv6

Hãy kiểm tra từ bên ngoài VPS, vì truy cập được localhost chưa chứng minh Internet kết nối được. Nếu dùng CDN hoặc WAF, bảo đảm đường dẫn /.well-known/acme-challenge/ không bị chặn. Nếu không thể mở cổng 80, hãy chuyển sang DNS-01.

Xem Thêm  Hướng dẫn đổi pass VPS nhanh chóng, dễ thực hiện

Nginx báo lỗi cấu hình hoặc phục vụ sai chứng chỉ

Chạy sudo nginx -t để xem file và dòng lỗi, thường là thiếu dấu ;, sai ngoặc hoặc đường dẫn chứng chỉ không tồn tại. Nếu website trả chứng chỉ của tên miền khác, hãy kiểm tra server_name trong khối cổng 443, đường dẫn ssl_certificate, cấu hình khai báo trùng và DNS có còn trỏ về máy chủ cũ không. Nếu thay đổi làm website lỗi, hãy khôi phục file từ bản sao trước khi cài SSL, rồi kiểm tra và nạp lại.

Không xóa thư mục /etc/letsencrypt/ để “cài lại từ đầu”, vì nơi này còn chứa chứng chỉ, khóa riêng và dữ liệu gia hạn của các website khác.

Lặp chuyển hướng hoặc còn tài nguyên HTTP

Vòng lặp thường xảy ra khi các lớp cấu hình yêu cầu trái ngược nhau, ví dụ Nginx ép HTTPS nhưng ứng dụng lại đưa về HTTP. Dùng curl -IL –max-redirs 10 http://example.com để quan sát và đối chiếu quy tắc ở Nginx, ứng dụng và CDN.

Với Cloudflare, chế độ Flexible kết nối về máy chủ gốc bằng HTTP và dễ tạo vòng lặp với Nginx. Khi VPS đã có chứng chỉ hợp lệ, hãy chuyển sang Full (strict).

Mixed content là trường hợp trang HTTPS vẫn gọi tài nguyên qua HTTP, thể hiện qua ảnh mất, thiếu CSS hoặc lỗi trong Console. Hãy sửa URL tại nguồn (giao diện, ứng dụng, nội dung hoặc cơ sở dữ liệu) và bảo đảm tài nguyên bên ngoài cũng hỗ trợ HTTPS.

Kiểm tra gia hạn tự động

Sau khi website ổn định, chạy thử gia hạn:

				
					sudo /snap/bin/certbot renew --dry-run
systemctl list-timers --all
				
			
Kiểm tra gia hạn chứng chỉ SSL tự động bằng lệnh certbot renew --dry-run và kiểm tra systemd timer trên Ubuntu
Kiểm tra gia hạn chứng chỉ SSL tự động bằng lệnh certbot renew –dry-run và kiểm tra systemd timer trên Ubuntu

Lệnh đầu thử quy trình gia hạn trên môi trường staging mà không thay chứng chỉ đang chạy. Lệnh sau giúp tìm timer của Certbot; với bản Snap, tên thường là snap.certbot.renew.timer. Đừng tạo thêm cron chỉ vì không thấy tên certbot.timer.

Hai bước này xác nhận hai việc khác nhau: dry run thành công nghĩa là quy trình gia hạn hoạt động, còn timer có lịch nghĩa là hệ thống có tác vụ gọi gia hạn định kỳ. Sau khi đổi IP, chuyển máy chủ, sửa firewall hoặc thêm CDN, hãy kiểm tra lại. Nếu dry run lỗi, đọc log tại /var/log/letsencrypt/letsencrypt.log.

Kết luận

Cài SSL Nginx hoàn tất khi website phục vụ đúng chứng chỉ, HTTP chuyển sang HTTPS đúng đích, tài nguyên tải bình thường và cơ chế gia hạn đã được kiểm tra. Quy trình trong hướng dẫn của Thuê VPS Giá Rẻ giúp bạn xác nhận từng phần này và xác định nơi cần xử lý khi phát sinh lỗi.

Có Thể Bạn Thích
Bài viết mới
Zalozalo
Telegram
Lên đầu trang