nginx多https证书配置实现

 更新时间:2024年04月29日 10:50:13   作者:zzhongcy  
本文主要介绍了nginx多https证书配置实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

首先,开启支持-TLS SNI support

什么是SNI?

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

SNI请求特点

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

支持-TLS SNI support

Nginx支持单IP多域名SSL证书需要OpenSSL支持,首先需要编译安装一个高版本的openssl。

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

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判断配置

ssl_server_name例子1:

对于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_name
        nixops.me
        nixops1.me
        nixops2.me
        #......
    ;

    ssl_certificate     $NixopsCert;
    ssl_certificate_key $NixopsKey;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
   #其它server段配置
}

这样同一站点有多个证书时,就可以只在server_name里添加,不需要指定https配置了,和http站点添加域名绑定非常类似。

ssl_server_name例子2:

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

# Settings for a TLS enabled server.
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    map $ssl_server_name $ssl_string {
        lwl.test.com lwl.test.com;
        lwl.test1.com lwl.test1.com;
        default lwl.default.com;
    }

    upstream lwl.test.com {
        server 192.168.58.196;
    }

    upstream lwl.test1.com {
        server 192.168.58.194:8081;
    }

    upstream lwl.default.com {
        server 192.168.58.195;
    }

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

        ssl_certificate /etc/nginx/ssl_sni/server/$ssl_string/server.crt;
        ssl_certificate_key /etc/nginx/ssl_sni/server/$ssl_string/server.key;

        include /etc/nginx/default.d/*.conf;

        location / {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Cookie $http_cookie;
            proxy_pass http://$ssl_string;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

本文通过结合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证书配置实现的文章就介绍到这了,更多相关nginx多https证书内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • Apache和Nginx的优缺点详解_动力节点Java学院整理

    Apache和Nginx的优缺点详解_动力节点Java学院整理

    Nginx和Apache一样,都是HTTP服务器软件,在功能实现上都采用模块化结构设计,都支持通用的语言接口。下面通过本文给大家分享Apache和Nginx比较 功能对比,感兴趣的朋友参考下吧
    2017-08-08
  • Nginx 499错误问题及解决办法

    Nginx 499错误问题及解决办法

    Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器,接下来通过本文给大家介绍Nginx 499错误问题及解决办法,一起看看吧
    2016-06-06
  • Linux中安装Nginx的正确步骤

    Linux中安装Nginx的正确步骤

    这篇文章主要给大家介绍了关于在Linux中安装Nginx的正确步骤,文中通过示例代码介绍的非常详细,对大家学习或者使用Nginx具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • 神器!最佳 Nginx 日志分析工具 GoAccess

    神器!最佳 Nginx 日志分析工具 GoAccess

    非常小又精悍的 Nginx 日志分析工具 GoAccess,今天在 CentOS VPS 上安装测试了一番,就2个字,神器!
    2014-02-02
  • Nginx+Lua+Redis构建高并发Web应用

    Nginx+Lua+Redis构建高并发Web应用

    使用Nginx+Lua+Redis来构建高并发Web应用,Curl请求Nginx,Nginx通过Lua查询Redis,返回json数据。
    2013-10-10
  • Nginx 获取客户端真实IP $remote_addr与X-Forwarded-For的实现

    Nginx 获取客户端真实IP $remote_addr与X-Forwarded-For的实现

    我们大多数情况下访问服务时,客户端并不是直接访问到服务器的,本文主要介绍了Nginx 获取客户端真实IP $remote_addr与X-Forwarded-For的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Nginx的location的常见规则优先级问题

    Nginx的location的常见规则优先级问题

    Nginx是反向代理和负载均衡的首选工具,nginx的location配置有许多细节内容在网上不容易找到资料,或者解释不清。本文对Nginx location规则优先级介绍,需要的朋友参考下吧
    2021-08-08
  • Windows下使用 Nginx 搭建 HTTP文件服务器 实现文件下载功能

    Windows下使用 Nginx 搭建 HTTP文件服务器 实现文件下载功能

    Nginx 是一款轻量级的 HTTP 服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的 IO 性能,时常用于服务端的反向代理和负载均衡,这篇文章主要介绍了Windows下使用 Nginx 搭建 HTTP文件服务器实现文件下载功能,需要的朋友可以参考下
    2023-03-03
  • uwsgi+nginx代理Django无法访问静态资源的解决

    uwsgi+nginx代理Django无法访问静态资源的解决

    这篇文章主要介绍了uwsgi+nginx代理Django无法访问静态资源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Ubuntu上安装Nginx服务器程序及简单的环境配置小结

    Ubuntu上安装Nginx服务器程序及简单的环境配置小结

    Nginx是一款高性能的异步非阻塞服务器应用程序,人气相当高,这里我们就来看一下在Ubuntu上安装Nginx服务器程序及简单的环境配置小结:
    2016-07-07

最新评论