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证书内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • nginx location语法使用介绍

    nginx location语法使用介绍

    Nginx 中的 Location 指令 是NginxHttpCoreModule中重要指令。Location 指令,是用来为匹配的 URI 进行配置,URI 即语法中的”/uri/”,可以是字符串或正则表达式。但如果要使用正则表达式,则必须指定前缀
    2015-01-01
  • 利用SSL配置Nginx反向代理的简单步骤

    利用SSL配置Nginx反向代理的简单步骤

    这篇文章主要给大家介绍了关于利用SSL配置Nginx反向代理的简单步骤,文中通过示例代码介绍的非常详细,对大家学习或者使用Nginx具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • 在Nginx中隐藏版本号的方法详解

    在Nginx中隐藏版本号的方法详解

    Nginx是一款高性能的Web服务器软件,它支持反向代理、负载均衡、缓存等功能,在使用 Nginx 的过程中,有时候我们需要隐藏 Nginx 的版本号,以增强服务器的安全性,所以接下来小编将给大家介绍如何在Nginx中隐藏版本号,需要的朋友可以参考下
    2023-11-11
  • Nginx四层负载均衡的配置指南

    Nginx四层负载均衡的配置指南

    当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃.为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力,这篇文章主要给大家介绍了关于Nginx四层负载均衡配置的相关资料,需要的朋友可以参考下
    2021-06-06
  • centos系统下LNMP环境一键安装

    centos系统下LNMP环境一键安装

    centos下的LNMP环境一键安装实现方法,需要的朋友可以参考下。
    2010-06-06
  • Nginx报错host not found in upstream的解决办法

    Nginx报错host not found in upstream的解决办法

    本文主要介绍了Nginx报错host not found in upstream的解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • 由于Nginx配置文件问题导致打不开网站unknown directive的解决

    由于Nginx配置文件问题导致打不开网站unknown directive的解决

    这篇文章主要介绍了由于Nginx配置文件问题导致打不开网站unknown directive,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • nginx之从main函数开始了解配置文件处理及配置信息的读入过程

    nginx之从main函数开始了解配置文件处理及配置信息的读入过程

    这篇文章主要介绍了nginx之从main函数开始了解配置文件处理及配置信息的读入过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-07-07
  • Nginx基于gzip压缩提高访问速度

    Nginx基于gzip压缩提高访问速度

    这篇文章主要介绍了Nginx基于gzip压缩提高访问速度,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • nginx如何限制访问某些url

    nginx如何限制访问某些url

    这篇文章主要关于介绍了nginx如何限制访问某些url的相关资料,nginx是非常出色web服务器,对于静态文件的处理非常高效,同时它的代理转发功能和其它后台服务器搭配起来也非常的简单高效,需要的朋友可以参考下
    2023-08-08

最新评论