在 Nginx 中,为多个域名配置国密证书,核心思路就是为每个域名创建独立的虚拟主机配置,并利用 SNI 技术让服务器根据域名自动选择对应的证书。这与普通 SSL证书的配置逻辑完全一致,只是将证书替换为国密版本。
方案一:为多个域名配置独立的Server块
这是最常见、最清晰的配置方式。你需要为每个需要独立的国密证书的域名,创建一个独立的 `server` 块。
核心参数都由 `ssl_certificate` 和 `ssl_certificate_key` 变为分别对应签名证书/私钥和加密证书/私钥。示例如下:
nginx
# 第一个域名: domain1.com
server {
listen 443 ssl;
server_name domain1.com; # 填写你的第一个域名
# 国密签名证书和私钥
ssl_certificate /path/to/domain1_sign.crt;
ssl_certificate_key /path/to/domain1_sign.key;
# 国密加密证书和私钥
ssl_certificate /path/to/domain1_encrypt.crt;
ssl_certificate_key /path/to/domain1_encrypt.key;
# ... 其他通用SSL配置 ...
}
# 第二个域名: domain2.com
server {
listen 443 ssl;
server_name domain2.com; # 填写你的第二个域名
# 国密签名证书和私钥
ssl_certificate /path/to/domain2_sign.crt;
ssl_certificate_key /path/to/domain2_sign.key;
# 国密加密证书和私钥
ssl_certificate /path/to/domain2_encrypt.crt;
ssl_certificate_key /path/to/domain2_encrypt.key;
# ... 其他通用SSL配置 ...
}
注意:一个证书只能用于它绑定的特定域名,不能跨域名复用。
方案二:对每个域名配置Dual Server块以实现双证书自适应(国密/RSA)
如果你的用户可能使用不支持国密算法的浏览器,可以配置双证书自适应方案来确保网站对所有人都可访问:为每个域名分别创建两个 `server` 块,一个用于国密证书,一个用于普通SSL证书。
这样当支持国密的浏览器访问时,服务器会自动选择国密证书通信;反之则使用RSA证书通信。
nginx
# 第一个域名 domain1.com 的国密证书配置
server {
listen 443 ssl;
server_name domain1.com;
ssl_certificate /path/to/domain1_sign.crt;
ssl_certificate_key /path/to/domain1_sign.key;
ssl_certificate /path/to/domain1_encrypt.crt;
ssl_certificate_key /path/to/domain1_encrypt.key;
# ... 国密专用SSL配置 ...
}
# 第一个域名 domain1.com 的RSA证书配置
server {
listen 443 ssl;
server_name domain1.com;
ssl_certificate /path/to/domain1_rsa.crt;
ssl_certificate_key /path/to/domain1_rsa.key;
# ... RSA SSL配置 ...
}
配置关键点与验证
1. 检查SNI支持:Nginx在 0.5.23 版本后就支持SNI,只需确保编译时包含了 `--with-http_ssl_module`。
2. 测试并重载:执行 `nginx -t` 测试语法,如无误则执行 `nginx -s reload` 重载配置。
3 快速验证:使用 `openssl s_client -connect domain1.com:443 -servername domain1.com` 命令,检查返回的证书信息是否与预期一致。
常见问题排查
启动或配置报错:首先确认所有证书文件路径正确且有读权限,其次检查是否满足所有 `listen` 端口未被占用的基础条件。
域名访问证书错误:使用 `nginx -T` 查看生效配置,确认 `server_name` 与实际域名、证书文件路径是否严格匹配。
HTTP自动跳转HTTPS:这是常见的需求,可通过以下配置实现。
nginx
server {
listen 80;
server_name domain1.com domain2.com;
return 301 https://$host$request_uri;
}
证书文件路径与更新:建议将证书放置在 `/etc/nginx/ssl/` 下按域名分目录管理,方便维护。更新时,先上传新证书覆盖旧文件,再执行 `nginx -s reload` 即可。
总结与建议
配置多域名国密证书的核心就是为每个域名创建独立的 `server` 块。建议优先使用方案一,维护简单,逻辑清晰。如果同时要保证浏览器兼容性,可选用方案二(Dual Server),实现双证书自适应。