如何配置Certbot以启用HTTPS?

以下是在 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 会:

  1. 验证域名所有权(需确保域名解析到服务器 IP,本地开发可跳过)。
  2. 自动修改 Nginx 配置启用 HTTPS。
  3. 询问是否强制重定向 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
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值