如何使用Certbot为Nginx配置未提及的域名生成多域名SSL证书
我来帮你搞定这个问题!Certbot的Nginx插件确实只会扫描现有配置文件里的域名,所以要给未配置的b.com和a.com一起生成证书,有两个靠谱的办法,看你偏好哪种:
方法1:临时添加Nginx配置让Certbot识别b.com
这种方法利用Certbot对Nginx配置的自动检测,步骤很直观:
- 给
b.com创建一个极简的Nginx配置文件,比如/etc/nginx/sites-available/b.com,内容可以是:
server { listen 80; server_name b.com www.b.com; # 如果需要覆盖www子域名就加上,不需要可以删掉 root /var/www/html; # 直接复用a.com的webroot目录就行 location / { return 200 "Temporary setup for Certbot"; } }
- 建立软链接到启用站点目录:
sudo ln -s /etc/nginx/sites-available/b.com /etc/nginx/sites-enabled/ - 测试Nginx配置合法性:
sudo nginx -t,没问题就重启Nginx:sudo systemctl reload nginx - 现在运行Certbot,要么交互式选择两个域名,要么直接用命令指定:
sudo certbot --nginx -d a.com -d www.a.com -d b.com -d www.b.com - 证书生成后,你可以把
b.com合并到a.com的配置里(比如把a.com的server_name改成server_name a.com www.a.com b.com www.b.com;),然后删掉b.com的单独配置,再重启Nginx即可。
方法2:使用webroot插件直接申请(无需修改Nginx配置)
如果不想折腾Nginx配置,用webroot插件更直接,它通过在网站根目录生成验证文件来完成域名所有权验证:
- 先确认
a.com的webroot目录(就是Nginx配置里root指令指定的路径,比如/var/www/a.com或/var/www/html) - 直接运行Certbot命令,指定两个域名和对应的webroot:
sudo certbot certonly --webroot -w /var/www/a.com -d a.com -d www.a.com -d b.com -d www.b.com-w后面是webroot路径,所有域名用同一个就行,因为它们指向同一个IP
- 证书生成后,你需要手动修改Nginx配置:要么给
b.com单独加HTTPS的server块,要么把b.com加到a.com的server_name里,然后配置ssl_certificate和ssl_certificate_key指向生成的证书文件(默认路径是/etc/letsencrypt/live/a.com/fullchain.pem和/etc/letsencrypt/live/a.com/privkey.pem)
注意事项
- 确保
b.com的DNS解析已经生效(指向同一个IP),不然Certbot验证会失败 - 证书自动续期的话,两种方法Certbot都会自动处理:用Nginx插件的续期命令会自动更新配置,webroot方法的默认续期任务也能正常运行
内容的提问来源于stack exchange,提问作者JGStyle




