如何批量生成SSL证书让多个子域名同时启用HTTPS?
在现代互联网环境中,网站启用HTTPS已经成为基本标准。无论是个人网站还是企业平台,都需要通过SSL证书来实现数据加密和身份验证。尤其对于拥有多个子域名的网站,例如一个主域名下包含blog、api、shop、cdn等子站点,如果每个子域名都要单独申请证书,不仅管理复杂,还会带来成本与维护压力。因此,如何批量生成SSL证书并让多个子域名同时启用HTTPS,就成为运维人员与开发者需要重点掌握的技术之一。
要理解如何实现这一目标,首先要明确SSL证书的种类与适用范围。根据域名匹配方式的不同,证书通常分为单域名证书、多域名证书(SAN证书)和通配符证书(Wildcard证书)。单域名证书只能保护一个域名,例如 www.example.com;多域名证书可以同时保护多个不同的域名;而通配符证书则可以保护某个主域名下的所有子域名,如 *.example.com 可以同时适用于 blog.example.com、api.example.com、cdn.example.com 等多个站点。对于需要让多个子域名批量启用HTTPS的情况,通配符证书无疑是最方便高效的解决方案。
在实践中,最常用且免费的SSL证书提供方是Let’s Encrypt。它支持自动签发、续期和批量管理,并且与多种服务器环境兼容。可以使用ACME协议进行证书验证,通过自动化脚本即可实现证书的生成与部署。下面将以Linux服务器为例,介绍如何批量生成SSL证书,让多个子域名同时启用HTTPS。
首先需要安装Certbot,这是官方推荐的自动化客户端。以Debian或Ubuntu系统为例,可以通过以下命令安装:
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
如果使用的是Apache服务器,则可以安装Apache插件:
sudo apt install certbot python3-certbot-apache -y
安装完成后,Certbot就可以与服务器进行交互,自动申请并配置SSL证书。
假设我们有多个子域名,例如 api.example.com、blog.example.com、shop.example.com,希望它们都启用HTTPS。最直接的方式是使用多域名证书功能。执行以下命令:
sudo certbot --nginx -d example.com -d api.example.com -d blog.example.com -d shop.example.com
其中 -d 参数用于指定需要绑定的域名。Certbot会自动与服务器通信,验证这些域名的所有权,并在验证通过后签发一份包含多个域名的证书。
如果网站数量较多,或者域名经常变动,那么使用通配符证书是更灵活的方案。支持通过DNS验证的方式签发通配符证书。执行以下命令即可申请:
sudo certbot -d *.example.com -d example.com --manual --preferred-challenges dns certonly
在执行过程中,Certbot会提示添加一条TXT类型的DNS记录,例如:
_acme-challenge.example.com TXT "随机验证字符串"
添加完成后,等待DNS解析生效,再继续执行操作,Certbot便会验证通过并生成证书文件。证书文件一般存放在 /etc/letsencrypt/live/example.com/ 目录下,其中包含四个主要文件:
cert.pem # 证书文件
chain.pem # 中间证书
fullchain.pem # 完整证书链
privkey.pem # 私钥
配置HTTPS时,通常使用 fullchain.pem 与 privkey.pem 这两个文件。
生成证书后,需要在服务器上配置Nginx或Apache,让多个子域名同时启用HTTPS。以Nginx为例,可以在配置文件中添加如下内容:
server {
listen 443 ssl;
server_name api.example.com blog.example.com shop.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
这里的 server_name 可以列出多个子域名,Nginx会根据访问域名自动匹配对应站点。只要这些子域名都包含在证书中,就能共用同一份SSL证书。对于启用了通配符证书的情况,只需写 server_name *.example.com 即可实现批量支持。
为了让用户在访问HTTP时自动跳转到HTTPS,还需要在配置中添加重定向规则:
server {
listen 80;
server_name api.example.com blog.example.com shop.example.com;
return 301 https://$host$request_uri;
}
这样,当用户访问 http://blog.example.com 时,会自动跳转至 https://blog.example.com,确保所有通信都在加密通道中进行。
免费证书的签发的证书有效期为90天,为了避免到期后手动更新的麻烦,可以通过计划任务实现自动续期。Certbot提供了自动续期命令:
sudo certbot renew --quiet
该命令会检测所有已安装的证书并在到期前自动续签。可以使用Crontab定时执行:
sudo crontab -e
在文件末尾添加一行:
0 3 * * * /usr/bin/certbot renew --quiet
这表示每天凌晨三点自动检测并续期证书,续期成功后会自动重载Nginx或Apache配置,确保HTTPS服务不间断运行。
对于大型网站或多台服务器的场景,可以使用ACME DNS API或第三方证书管理平台进行集中管理。以acme.sh为例,它比Certbot更加轻量灵活,并支持更多DNS提供商的自动验证:
curl https://get.acme.sh | sh
source ~/.bashrc
acme.sh --issue -d example.com -d *.example.com --dns dns_cf
这里的 dns_cf 表示API自动添加验证记录,从而实现完全无人值守的批量签发。生成的证书同样可以直接部署到Nginx:
acme.sh --install-cert -d example.com \
--key-file /etc/nginx/ssl/example.com.key \
--fullchain-file /etc/nginx/ssl/example.com.crt \
--reloadcmd "systemctl reload nginx"
这种方式非常适合需要频繁增减子域名或拥有多服务器集群的企业使用。
此外,使用反向代理或负载均衡系统也能进一步简化HTTPS部署。通过在代理层安装通配符证书,可以让后端所有子站点共享加密通道,而无需每台服务器单独配置证书。这样不仅提升管理效率,还能减少更新维护的复杂度。
需要注意的是,虽然通配符证书能保护大多数子域名,但它并不包括二级或更深层的域名。例如 *.example.com 无法覆盖 shop.api.example.com。如果业务中存在多层子域名结构,仍需使用多域名证书或针对性配置。
在完成证书生成与配置后,可以使用在线工具如SSL Labs或命令行命令验证HTTPS部署是否成功:
curl -I https://api.example.com
如果返回状态码为200或301,并显示有效的TLS连接信息,说明证书配置成功。
CN
EN