以下是在 WSL2 (Ubuntu 24.04 LTS) 上使用 Certbot 为 Nginx 配置 HTTPS 的完整步骤,适用于已部署的 Laravel 项目:
1. 安装 Certbot 和 Nginx 插件
# 更新系统
sudo apt update
# 安装 Certbot 和 Nginx 插件
sudo apt install certbot python3-certbot-nginx -y
2. 确保 Nginx 配置正确
确认你的 Nginx 配置(如 /etc/nginx/sites-available/laravel.conf
)包含正确的 server_name
:
server {
listen 80;
server_name laravel.test; # 必须与域名一致
root /var/www/myproject/public;
# ... 其他配置 ...
}
重启 Nginx:
sudo systemctl restart nginx
3. 申请 SSL 证书
运行以下命令(替换 laravel.test
为你的域名):
sudo certbot --nginx -d laravel.test
Certbot 会:
- 验证域名所有权(需确保域名解析到服务器 IP,本地开发可跳过)。
- 自动修改 Nginx 配置启用 HTTPS。
- 询问是否强制重定向 HTTP → HTTPS(建议选
2
强制跳转)。
4. 验证证书自动续订
Certbot 会自动创建定时任务,但可手动测试:
# 测试续订(不实际执行)
sudo certbot renew --dry-run
# 手动续订(默认证书有效期 90 天)
sudo certbot renew
5. 检查 Nginx 配置变化
Certbot 会自动修改你的 Nginx 配置,生成类似以下内容:
server {
listen 443 ssl;
server_name laravel.test;
ssl_certificate /etc/letsencrypt/live/laravel.test/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/laravel.test/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# ... 其他配置 ...
}
server {
listen 80;
server_name laravel.test;
return 301 https://$host$request_uri; # HTTP 强制跳转 HTTPS
}
6. 本地开发特殊处理(无真实域名)
如果仅在本地测试(如 laravel.test
),需手动生成自签名证书:
# 生成自签名证书(有效期 365 天)
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/nginx-selfsigned.key \
-out /etc/ssl/certs/nginx-selfsigned.crt
# 修改 Nginx 配置
sudo nano /etc/nginx/sites-available/laravel.conf
添加 SSL 配置:
server {
listen 443 ssl;
server_name laravel.test;
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
# ... 其他配置 ...
}
重启 Nginx:
sudo systemctl restart nginx
浏览器访问:
需手动信任证书(访问 https://laravel.test
后忽略浏览器警告)。
7. 修复 Laravel 混合内容问题
在 .env
中强制启用 HTTPS:
APP_URL=https://laravel.test
在 AppServiceProvider.php
中添加(可选):
use Illuminate\Support\Facades\URL;
public function boot() {
if (env('APP_ENV') === 'production') {
URL::forceScheme('https');
}
}
8. 验证 HTTPS 是否生效
curl -I https://laravel.test
应返回:
HTTP/2 200
server: nginx
...
strict-transport-security: max-age=31536000; includeSubDomains
9. 常见问题
问题 1:Certbot 报错 "Could not find a virtual host"
- 确保 Nginx 配置中的
server_name
与 Certbot 命令中的域名一致。 - 检查 Nginx 配置语法:
sudo nginx -t
问题 2:浏览器提示 “不安全连接”(自签名证书)
- 手动导入证书到浏览器信任库,或使用真实域名 + Let’s Encrypt。
问题 3:证书续订失败
- 检查 Certbot 日志:
sudo tail -f /var/log/letsencrypt/letsencrypt.log
总结
✅ HTTPS 已启用:
- 使用 Let’s Encrypt 免费证书(生产环境推荐)。
- 本地开发可用 自签名证书。
- 自动续订 + HTTP 强制跳转 HTTPS。
🚀 下一步建议:
- 配置 HSTS 增强安全性。
- 使用
nginx -t
定期检查配置。 - 监控证书过期时间:
sudo certbot certificates