Bảo Mật Laravel với Nginx và Let's Encrypt SSL
Năm 2026, HTTPS không còn là tùy chọn. Trình duyệt đánh dấu trang HTTP là "Không An Toàn", Google phạt chúng trong bảng xếp hạng, và các tính năng hiện đại như Service Worker (PWA) yêu cầu SSL để hoạt động.
Nhờ có Let's Encrypt và Certbot, việc có được chứng chỉ SSL hợp lệ là miễn phí, tự động, và mất chưa đến 5 phút.
Đây là hướng dẫn đầy đủ để bảo mật ứng dụng Laravel của bạn đang chạy trên Ubuntu và Nginx.
Điều Kiện Tiên Quyết
- Một Virtual Private Server (VPS) chạy Ubuntu 22.04 hoặc 24.04.
- Nginx đã được cài đặt (
sudo apt install nginx). - Tên Miền trỏ đến địa chỉ IP của server.
Bước 1: Cài Đặt Certbot
Certbot là client chính thức cho Let's Encrypt. Chúng ta cũng cần plugin Nginx, giúp tự động hóa việc chỉnh sửa cấu hình.
sudo apt update
sudo apt install certbot python3-certbot-nginx
Bước 2: Chuẩn Bị Cấu Hình Nginx
Certbot cần tìm một block server trong cấu hình Nginx phù hợp với domain của bạn.
Mở cấu hình site của bạn:
sudo nano /etc/nginx/sites-available/my-blog
Đảm bảo bạn có directive server_name được đặt đúng:
server {
listen 80;
server_name my-blog.com www.my-blog.com;
root /var/www/my-blog/public;
# ... phần còn lại của config
}
Kiểm tra cấu hình và reload:
sudo nginx -t
sudo systemctl reload nginx
Bước 3: Lấy Chứng Chỉ
Chạy lệnh sau. Flag --nginx nói với Certbot phân tích cấu hình Nginx và thiết lập SSL tự động.
sudo certbot --nginx -d my-blog.com -d www.my-blog.com
Wizard tương tác sẽ hỏi:
- Địa Chỉ Email: Cho các cảnh báo gia hạn khẩn cấp.
- Điều Khoản Dịch Vụ: Bạn phải đồng ý.
- Redirect HTTP sang HTTPS: Chọn Option 2 (Redirect). Điều này đảm bảo tất cả traffic được mã hóa.
Vừa Xảy Ra Điều Gì?
Certbot tự động:
- Xác minh quyền sở hữu domain qua ACME challenge.
- Tải về các file chứng chỉ
.pemvào/etc/letsencrypt/live/my-blog.com/. - Cập nhật cấu hình Nginx để lắng nghe trên port 443 (HTTPS).
- Thêm Redirect 301 từ port 80 sang 443.
Bước 4: Xác Minh Tự Động Gia Hạn
Chứng chỉ Let's Encrypt có hiệu lực 90 ngày. Tuy nhiên, package Certbot cài đặt một systemd timer chạy hai lần mỗi ngày để gia hạn bất kỳ chứng chỉ nào trong vòng 30 ngày trước khi hết hạn.
Bạn có thể kiểm tra quá trình gia hạn với dry run:
sudo certbot renew --dry-run
Nếu bạn thấy "Congratulations, all simulated renewals succeeded", thiết lập của bạn không cần bảo trì.
Bước 5: Cấu Hình Laravel
Bây giờ Nginx đã được bảo mật, đảm bảo Laravel biết về điều đó.
1. Cập Nhật .env
APP_URL=https://my-blog.com
2. Bắt Buộc HTTPS (Tùy Chọn nhưng Khuyến Nghị)
Nếu bạn ở sau Load Balancer hoặc sử dụng Cloudflare, Laravel có thể không phát hiện HTTPS đúng cách. Trong App\Providers\AppServiceProvider.php:
use Illuminate\Support\Facades\URL;
public function boot(): void
{
if ($this->app->environment('production')) {
URL::forceScheme('https');
}
}
Bonus: Cải Thiện Điểm Bảo Mật (SSL Labs)
Cài đặt mặc định của Certbot tốt, nhưng để đạt đánh giá A+ trên SSL Labs, bạn nên bật HSTS (HTTP Strict Transport Security).
Mở lại cấu hình site cụ thể của bạn:
sudo nano /etc/nginx/sites-available/my-blog
Thêm điều này vào trong SSL server block (port 443):
server {
listen 443 ssl;
# ... định nghĩa cert ...
# HSTS (ngx_http_headers_module là bắt buộc) (15768000 giây = 6 tháng)
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always;
# ... phần còn lại của config
}
Reload Nginx:
sudo systemctl reload nginx
Kết Luận
Bây giờ bạn có:
- ✅ Chứng chỉ SSL hợp lệ.
- ✅ Tự động redirect HTTPS.
- ✅ Tự động gia hạn.
- ✅ Cải thiện SEO và Sự Tin Tưởng của Người Dùng.
Không có lý do gì để chạy một trang web trên HTTP năm 2026.