其实有很多方式,网上看到一个这个方法,给大家介绍一下。
首先,开启支持-TLS SNI support
Nginx开启单IP多SSL证书支持-TLS SNI support
Nginx支持单IP多域名SSL证书需要OpenSSL支持,首先需要编译安装一个高版本的openssl。
检查nginx是否支持TLS SNI support:
/usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.10.2
TLS SNI support disabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
TLS SNI support disabled 这样是不支持的。
下面开始升级openssl:
wget ftp://ftp.openssl.org/source/openssl-1.0.2h.tar.gz
tar xzvf openssl-1.0.2h.tar.gz
cd openssl-1.0.2h
./config --prefix=/usr/local/openssl/ enable-shared enable-tlsext
make && make install
[root@localhost ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.10.2
built by gcc 4.1.2 20080704 (Red Hat 4.1.2-55)
built with OpenSSL 1.0.2h 21 Dec 2016
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-openssl=/usr/local/openssl --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module
方法1:多server配置不同证书和域名
server {listen 443;server_name *.www.aabb.com;index index.html index.htm index.php;root /data/wwwroot/www.aabb.com/webroot;ssl on;ssl_certificate "/usr/local/nginx/conf/ssl/_.www.aabb.com.public.cer";ssl_certificate_key "/usr/local/nginx/conf/ssl/_.www.aabb.com.private.key"; ...... } server {listen 443;server_name www.aabb.com;index index.html index.htm index.php;root /data/wwwroot/www.aabb.com/webroot;ssl on;ssl_certificate "/usr/local/nginx/conf/ssl/www.aabb.com.public.cer";ssl_certificate_key "/usr/local/nginx/conf/ssl/www.aabb.com.private.key"; ...... }
方法2:根据ssl_server_name判断配置
对于nginx多https站点通常的做法是这样:
server 443 ssl;
server_name nixops1.me;
ssl_certificate /usr/local/nginx/keys/nixops1.me.crt;
ssl_certificate_key /usr/local/nginx/keys/nixops1.me.key;
......
如果有多个https站点,就是每个站点复制一份这个配置。如nixops2.me、nixops3.me等等,在只有几十个https站点的时候还好,如果某个站点的域名特别多,例如有几千个域名甚至上万个域名的时候,这个配置就很恐怖了,需要精简并合并配置。
下面举例说明,假设应用场景为:
- 同一站点有大量域名需要配置https证书,其它配置一样
- 每个之证书都是泛域名证书,如let's encrypt的wildcard证书
- 所有证书命名均为公钥domain.com.crt、私钥为domain.com.key 这样的格式
- 所有证书保存在相同目录中,如/usr/local/nginx/conf/keys/
具体做法可以用nginx的map和正则表达式,根据ssl_server_name(即https的访问域名),获取公钥和私钥的完整路径做为变量。配置证书时使用该变量即可。先来看nginx配置文件中HTTP段的map配置:
map $ssl_server_name $NixopsCert {default /usr/local/nginx/conf/keys/nixops.me.crt; #指定一个默认的证书~*^(.+\.)*([^\.]+\.[^\.]+)$ /usr/local/nginx/conf/keys/$2.crt;
}map $ssl_server_name $NixopsKey {default /usr/local/nginx/conf/keys/nixops.me.key;~*^(.+\.)*([^\.]+\.[^\.]+)$ /usr/local/nginx/conf/keys/$2.key;
}
这样配置好后,如果通过https访问nixops1.me或*.nixops1.me,获取到的路径分别为:
$NixopsCert --> /usr/local/nginx/conf/keys/nixops1.me.crt;
$NixopsKey --> /usr/local/nginx/conf/keys/nixops1.me.key;
然后配置server段证书公钥和私钥时就不需要按传统作法复制配置,只需指定变量即可:
server {listen 80;listen 443 ssl http2;server_namenixops.menixops1.menixops2.me#......;ssl_certificate $NixopsCert;ssl_certificate_key $NixopsKey;add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;#其它server段配置
}
这样同一站点有多个证书时,就可以只在server_name里添加,不需要指定https配置了,和http站点添加域名绑定非常类似。
方法3:一个server设置多个域名和ssl证书(没尝试,有待验证)
多域名多证书可以使用多个server 多个子配置文件进行设置并且方便管理
还有一种就是一个server设置多个域名和ssl证书
看图 因为80端口不涉及证书 所以这里以443端口为例
server_name 中第二个域名与第一个域名之间以空格隔开,
再复制一份 ssl_certificate ; 和 ssl_certificate_key ;输入第二个域名的证书文件地址即可
参考:
nginx多https证书配置精简 - 阅心笔记
nginx一个server配置多域名多ssl证书_nginx多证书-CSDN博客