0


nginx多https证书配置精简

其实有很多方式,网上看到一个这个方法,给大家介绍一下。

首先,开启支持-TLS SNI support

什么是SNI?

  1. 传统的应用场景中,一台服务器对应一个IP地址,一个域名,使用一张包含了域名信息的证书。随着云计算技术的普及,在云中的虚拟机有了一个IP,对应多个域名,使用多张证书的应用场景,SNI技术应运而生。SNIServer Name Indication),即实现了一个服务器使用多个域名证书的TLS扩展,支持用户配置多个域名证书。

SNI请求特点

  1. HTTP请求的Host字段在请求的Header中。发起HTTPS请求时,在TLS握手阶段,还无法进行HTTP数据的解析,此时TLS协议的Client Hello字段新增了一个Server Name字段,请求的客户端可以通过这个字段填充请求的Host信息,而服务端在TLS握手阶段就可以选择请求处理的证书,实现SNI的功能。

支持-TLS SNI support

  1. Nginx支持单IP多域名SSL证书需要OpenSSL支持,首先需要编译安装一个高版本的openssl
  2. Nginx支持SNI,允许在同一个TLS服务端口下,配置不同的域名,用户通过请求不同的证书域名,可返回相应的upstream响应结果。

检查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配置不同证书和域名

  1. server {
  2. listen 443;
  3. server_name *.www.aabb.com;
  4. index index.html index.htm index.php;
  5. root /data/wwwroot/www.aabb.com/webroot;
  6. ssl on;
  7. ssl_certificate "/usr/local/nginx/conf/ssl/_.www.aabb.com.public.cer";
  8. ssl_certificate_key "/usr/local/nginx/conf/ssl/_.www.aabb.com.private.key";
  9. ......
  10. }
  11. server {
  12. listen 443;
  13. server_name www.aabb.com;
  14. index index.html index.htm index.php;
  15. root /data/wwwroot/www.aabb.com/webroot;
  16. ssl on;
  17. ssl_certificate "/usr/local/nginx/conf/ssl/www.aabb.com.public.cer";
  18. ssl_certificate_key "/usr/local/nginx/conf/ssl/www.aabb.com.private.key";
  19. ......
  20. }

方法2:根据ssl_server_name判断配置

ssl_server_name例子1:

对于nginx多https站点通常的做法是这样:

  1. server 443 ssl;
  2. server_name nixops1.me;
  3. ssl_certificate /usr/local/nginx/keys/nixops1.me.crt;
  4. ssl_certificate_key /usr/local/nginx/keys/nixops1.me.key;
  5. ......
  1. 如果有多个https站点,就是每个站点复制一份这个配置。如nixops2.menixops3.me等等,在只有几十个https站点的时候还好,如果某个站点的域名特别多,例如有几千个域名甚至上万个域名的时候,这个配置就很恐怖了,需要精简并合并配置。

下面举例说明,假设应用场景为:

  1. 同一站点有大量域名需要配置https证书,其它配置一样

  2. 每个之证书都是泛域名证书,如let's encrypt的wildcard证书

  3. 所有证书命名均为公钥domain.com.crt、私钥为domain.com.key 这样的格式

  4. 所有证书保存在相同目录中,如/usr/local/nginx/conf/keys/

    1. **具体做法可以用nginxmap和正则表达式,根据ssl_server_name(即https的访问域名),获取公钥和私钥的完整路径做为变量**。配置证书时使用该变量即可。先来看nginx配置文件中HTTP段的map配置:
  1. map $ssl_server_name $NixopsCert {
  2. default /usr/local/nginx/conf/keys/nixops.me.crt; #指定一个默认的证书
  3. ~*^(.+\.)*([^\.]+\.[^\.]+)$ /usr/local/nginx/conf/keys/$2.crt;
  4. }
  5. map $ssl_server_name $NixopsKey {
  6. default /usr/local/nginx/conf/keys/nixops.me.key;
  7. ~*^(.+\.)*([^\.]+\.[^\.]+)$ /usr/local/nginx/conf/keys/$2.key;
  8. }

这样配置好后,如果通过https访问nixops1.me或*.nixops1.me,获取到的路径分别为:

  1. $NixopsCert --> /usr/local/nginx/conf/keys/nixops1.me.crt;
  2. $NixopsKey --> /usr/local/nginx/conf/keys/nixops1.me.key;

然后配置server段证书公钥和私钥时就不需要按传统作法复制配置,只需指定变量即可:

  1. server {
  2. listen 80;
  3. listen 443 ssl http2;
  4. server_name
  5. nixops.me
  6. nixops1.me
  7. nixops2.me
  8. #......
  9. ;
  10. ssl_certificate $NixopsCert;
  11. ssl_certificate_key $NixopsKey;
  12. add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
  13. #其它server段配置
  14. }
  1. 这样同一站点有多个证书时,就可以只在server_name里添加,不需要指定https配置了,和http站点添加域名绑定非常类似。

ssl_server_name例子2:

  1. **在1.7.0版本开始,Nginx支持通过$ssl_server_name 变量获取TLS中的Server Name**,我们可以据此结合map映射指令,提升配置的重用度,一种优化后的配置方式如下:

Settings for a TLS enabled server.

  1. ssl_session_cache shared:SSL:1m;
  2. ssl_session_timeout 10m;
  3. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  4. ssl_ciphers HIGH:!aNULL:!MD5;
  5. ssl_prefer_server_ciphers on;
  6. map $ssl_server_name $ssl_string {
  7. lwl.test.com lwl.test.com;
  8. lwl.test1.com lwl.test1.com;
  9. default lwl.default.com;
  10. }
  11. upstream lwl.test.com {
  12. server 192.168.58.196;
  13. }
  14. upstream lwl.test1.com {
  15. server 192.168.58.194:8081;
  16. }
  17. upstream lwl.default.com {
  18. server 192.168.58.195;
  19. }

server {
listen 443 ssl;
listen [::]:443 ssl;
server_name $ssl_string;
root /usr/share/nginx/html;

  1. ssl_certificate /etc/nginx/ssl_sni/server/$ssl_string/server.crt;
  2. ssl_certificate_key /etc/nginx/ssl_sni/server/$ssl_string/server.key;
  3. include /etc/nginx/default.d/*.conf;
  4. location / {
  5. proxy_set_header Host $host;
  6. proxy_set_header X-Real-IP $remote_addr;
  7. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  8. proxy_set_header Cookie $http_cookie;
  9. proxy_pass http://$ssl_string;
  10. }
  11. error_page 404 /404.html;
  12. location = /40x.html {
  13. }
  14. error_page 500 502 503 504 /50x.html;
  15. location = /50x.html {
  16. }
  17. }
  18. 本文通过结合Nginx的 $ssl_server_name 变量与map指令,提供了一种支持多个SNI证书配置的实现方式,提高了配置维护的重用度。

方法3:一个server设置多个域名和ssl证书(没尝试,有待验证)

多域名多证书可以使用多个server 多个子配置文件进行设置并且方便管理

还有一种就是一个server设置多个域名和ssl证书

看图 因为80端口不涉及证书 所以这里以443端口为例

server_name 中第二个域名与第一个域名之间以空格隔开,

再复制一份 ssl_certificate ; 和 ssl_certificate_key ;输入第二个域名的证书文件地址即可

参考:

nginx多https证书配置精简 - 阅心笔记

nginx一个server配置多域名多ssl证书_nginx多证书-CSDN博客

标签: nginx https 运维

本文转载自: https://blog.csdn.net/yangyangye/article/details/137455030
版权归原作者 zzhongcy 所有, 如有侵权,请联系我们删除。

“nginx多https证书配置精简”的评论:

还没有评论