用户如何为多个域名配置SSL证书。分以下几种情况:
1. 单个证书包含多个域名(SAN证书)
2. 通配符证书(*.example.com)可以覆盖一个域名的所有子域名
3. 为每个域名单独申请证书
配置步骤大致如下:
1. 生成私钥和证书签名请求(CSR)
2. 从证书颁发机构(CA)获取证书(或者使用自签名证书)
3. 在服务器上配置证书
这里以使用OpenSSL生成CSR和私钥,并且配置Nginx为例。
情况1:单个证书包含多个域名(SAN证书)
步骤:
1. 创建一个包含所有域名的配置文件(比如san.cnf):
[req]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
[ dn ]
C = CN
ST = Beijing
L = Beijing
O = Example Company
OU = IT Department
emailAddress = admin@example.com
CN = example.com
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = example.com
DNS.2 = www.example.com
DNS.3 = example.net
DNS.4 = www.example.net
可以继续添加其他域名
2. 生成私钥和CSR:
openssl req -new -nodes -keyout san.key -out san.csr -config san.cnf
3. 将CSR提交给CA,CA会颁发一个包含所有域名的证书。
4. 将CA返回的证书(例如san.crt)和私钥(san.key)放在服务器上。
5. 在Nginx配置中:
server {
listen 443 ssl;
server_name example.com www.example.com example.net www.example.net;
ssl_certificate /path/to/san.crt;
ssl_certificate_key /path/to/san.key;
其他配置
}
注意:如果域名很多,可以配置多个server块,但都指向同一个证书。
情况2:通配符证书
1. 生成CSR时,域名填写为*.example.com
2. 获取通配符证书后,配置Nginx:
server {
listen 443 ssl;
server_name example.com *.example.com;
ssl_certificate /path/to/wildcard.crt;
ssl_certificate_key /path/to/wildcard.key;
其他配置
}
情况3:多个独立证书
为每个域名单独申请证书,然后配置多个server块:
server {
listen 443 ssl;
server_name domain1.com;
ssl_certificate /path/to/domain1.crt;
ssl_certificate_key /path/to/domain1.key;
}
server {
listen 443 ssl;
server_name domain2.com;
ssl_certificate /path/to/domain2.crt;
ssl_certificate_key /path/to/domain2.key;
}
另外,如果使用Let's Encrypt,可以使用Certbot工具自动配置多个域名的证书,支持SAN和通配符。
以Certbot申请通配符证书(需要DNS验证):
certbot certonly --manual --preferred-challenges=dns -d *.example.com -d example.com --server https://acme-v02.api.letsencrypt.org/directory
申请多个域名的SAN证书:
certbot certonly --standalone -d example.com -d www.example.com -d example.net -d www.example.net
然后Certbot会自动获取证书并保存到指定目录(通常是/etc/letsencrypt/live/),在Nginx中配置相应路径即可。
总结:根据需求选择合适的方式。如果多个域名属于同一组服务,使用SAN证书比较方便;如果是同一主域的不同子域,通配符证书更合适;如果域名之间没有关联,独立证书更灵活。
配置多域名的SSL证书通常有两种方法:多域名证书(SAN证书) 和通配符证书。以下是详细步骤:
方法1:多域名证书(SAN证书)
特点:一个证书覆盖多个独立域名(如 example.com + blog.example.net)。
步骤:
生成CSR(证书签名请求)
创建配置文件 san.cnf,包含所有域名:
ini
[req]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
[req_distinguished_name]
countryName = CN
stateOrProvinceName = Beijing
localityName = Beijing
organizationName = My Company
commonName = example.com # 主域名
[req_ext]
subjectAltName = @alt_names
[alt_names]
DNS.1 = example.com # 主域名
DNS.2 = www.example.com # 子域名
DNS.3 = blog.example.net # 其他域名
可继续添加更多域名...
生成私钥和CSR:
bash
openssl req -new -nodes -keyout san.key -out san.csr -config san.cnf
向CA申请证书
提交 san.csr 给证书颁发机构(如 Let's Encrypt、DigiCert),CA会返回包含所有域名的证书文件(如 san.crt)。
配置Web服务器
Nginx 示例:
nginx
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /path/to/san.crt;
ssl_certificate_key /path/to/san.key;
其他配置...
}
server {
listen 443 ssl;
server_name blog.example.net;
ssl_certificate /path/to/san.crt; # 使用同一个证书
ssl_certificate_key /path/to/san.key;
其他配置...
}
Apache 示例:
apache
<VirtualHost *:443>
ServerName example.com
SSLEngine on
SSLCertificateFile /path/to/san.crt
SSLCertificateKeyFile /path/to/san.key
</VirtualHost>
<VirtualHost *:443>
ServerName blog.example.net
SSLEngine on
SSLCertificateFile /path/to/san.crt # 同一个证书
SSLCertificateKeyFile /path/to/san.key
</VirtualHost>
方法2:通配符证书(Wildcard Certificate)
特点:覆盖一个域名的所有子域名(如 *.example.com 包含 blog.example.com、api.example.com),但不支持跨域名(如 example.net)。
步骤:
生成CSR
用通配符作为域名:
bash
openssl req -new -newkey rsa:2048 -nodes \
keyout wildcard.key -out wildcard.csr \
subj "/CN=*.example.com"
向CA申请证书
提交CSR,获取通配符证书(如 wildcard.crt)。
配置Web服务器
Nginx 示例:
nginx
server {
listen 443 ssl;
server_name ~^(.*)\.example\.com$; # 匹配所有子域名
ssl_certificate /path/to/wildcard.crt;
ssl_certificate_key /path/to/wildcard.key;
}
自动化工具推荐(Let's Encrypt)
使用 certbot 自动申请和管理证书:
多域名证书申请:
bash
certbot certonly --nginx -d example.com -d www.example.com -d blog.example.net
Certbot 会自动配置Nginx并续签证书。
通配符证书申请(需DNS验证):
bash
certbot certonly --manual --preferred-challenges=dns \
d *.example.com -d example.com
根据提示添加DNS TXT记录验证域名所有权。
注意事项
证书兼容性:
SAN证书:确保所有域名在 subjectAltName 中列出。
通配符证书:仅覆盖一级子域名(*.example.com 不包含 a.b.example.com)。
私钥安全:私钥文件(.key)需严格保密。
续签:Let's Encrypt 证书有效期90天,建议配置自动续期:
bash
certbot renew --quiet --no-self-upgrade
用户通过以上几种方法,就可以高效配置多域名SSL证书。