nginx中同一端口不同tls版本与加密套件

天翼云开发者社区
• 阅读 1

本文分享自天翼云开发者社区《nginx中同一端口不同tls版本与加密套件》.作者:z****n

1.问题描述

需要在nginx中使用2个域名同时监听443端口,域名a只允许使用tls1.2,域名b允许tls1.2,tls1.3。 实际运行发现原生nginx无法实现 nginx.conf配置如下

worker_processes  1;
error_log  logs/error.log  debug;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    server {
        listen 443 ssl;
        server_name www.a.com;
        ssl_protocols       TLSv1.2;
        ssl_certificate         ssl/a.crt;
        ssl_certificate_key     ssl/a.key;
        location / {
            return 200 ok;
        }
    }

    server {
        listen 443 ssl;
        server_name www.b.com;
        ssl_protocols       TLSv1.2  TLSv1.3;
        ssl_certificate         ssl/b.crt;
        ssl_certificate_key     ssl/b.key;
        location / {
            return 200 ok;
        }
    }
} 

1.使用tls1.2连接www.a.com可以实现 openssl s_client -connect 127.0.0.1:443 -servername www.a.com -tls1_2

nginx中同一端口不同tls版本与加密套件

2.使用tls1.2连接www.b.com可以实现 openssl s_client -connect 127.0.0.1:443 -servername www.b.com -tls1_2

3.使用tls1.3连接www.b.com不可以实现 openssl s_client -connect 127.0.0.1:443 -servername www.b.com -tls1_3

nginx中同一端口不同tls版本与加密套件

2.原理

tls握手原理中,在客户端发起的client_hello到服务端时,会告知服务端客户端支持的tls版本,加密套件。接着服务器响应serve_hello告知客户端,服务器选择的serve_hello。所以tls版本在握手的client_hello和serve_hello阶段必须协商完成,

然而原生的nginx并没有介入openssl的client_hello的阶段,即openssl在握手过程中会使用nginx的默认default server (默认第一个server块) 的ssl_protocols 指令配置。

所以要根据不同的sni制定不同的tls版本就需要在openssl提供的client_hello阶段中根据不同的sni判断是否使用不同的tls协议版本。

3.第三方模块

使用github上模块 https://github.com/zengjinji/ngx_http_ssl_client_hello_module 修改nginx.conf配置,新增ssl_client_hello on;指令

worker_processes  1;
error_log  logs/error.log  debug;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    #第三方模块新增指令
    ssl_client_hello on;

    server {
        listen 443 ssl;
        server_name www.a.com;
        ssl_protocols       TLSv1.2;
        ssl_certificate         ssl/a.crt;
        ssl_certificate_key     ssl/a.key;
        location / {
            return 200 ok;
        }
    }

    server {
        listen 443 ssl;
        server_name www.b.com;
        ssl_protocols       TLSv1.2  TLSv1.3;
        ssl_certificate         ssl/b.crt;
        ssl_certificate_key     ssl/b.key;
        location / {
            return 200 ok;
        }
    }
} 

再次尝试用tls1.3连接www.b.com可以实现 openssl s_client -connect 127.0.0.1:443 -servername www.b.com -tls1_3

nginx中同一端口不同tls版本与加密套件

使用tls1.2连接www.b.com可以实现 openssl s_client -connect 127.0.0.1:443 -servername www.b.com -tls1_2

使用tls1.3连接www.a.com不可以实现 openssl s_client -connect 127.0.0.1:443 -servername www.a.com -tls1_3

使用tls1.2连接www.a.com可以实现 openssl s_client -connect 127.0.0.1:443 -servername www.a.com -tls1_2

此外,也可以使用openresty的1.21.4.1版本,1.21.4.1版本增加了ssl_client_hello_by_lua_block ,原理一样也是在openssl的client_hello阶段中根据不同的sni区分使用不同的协议

点赞
收藏
评论区
推荐文章
Stella981 Stella981
4年前
Nginx 简单配置域名跳转
暂时用到这么多,简单记录下首先要买个域名去买域名的网站后台管理配置域名解析,设置跳转到服务器公网ip直接访问公网ip的结果是访问80端口,一般web应用并不是,如tomcat默认8080服务器安装Nginx修改Nginx配置文件,转发80端口收到的请求到web应用的真实地址使生效
Stella981 Stella981
4年前
Nginx反向代理中文域名
1、修改nginx.conf配置文件  http{   中文域名解析需配置size为64   server\_names\_hash\_bucket\_size64;   client\_max\_body\_size  10m;   include      mime.types;   default
Stella981 Stella981
4年前
Nginx负载均衡
前面我们说了反向代理,例子中用的是,两个请求请求同一个ip地址和端口,然后Nginx来根据域名调用不同的tomcat来进行请求处理及响应。反向代理主要说的是:不同的请求请求同一个Nginx服务器,Nginx服务器来决定由那个真正的业务服务器(eg:tomcat)处理某个请求。下面说负载均衡负载均衡一般是指,针对同一个(域名的)请求发送很多次,同
Wesley13 Wesley13
4年前
nginx配置虚拟主机相关教程
1.配置虚拟主机配置虚拟主机即:在一台服务器上启动多个网站;区分不同的网站方式:域名不同,端口不同;1.1通过端口区分虚拟主机1.1.1server节点的介绍nginx的配置文件路径:/usr/local/nginx/conf/nginx.conf一个se
程序员小五 程序员小五
1年前
融云IM干货丨如何防止HTTPS被降级攻击?
为了防止HTTPS被降级攻击,可以采取以下措施:强制使用安全的协议版本:配置服务器以仅允许安全的TLS版本(如TLS1.2或更高版本)。不要允许旧的、已知不安全的协议版本,如SSLv2、SSLv3和TLS1.0。禁用弱加密套件:从服务器配置中移除所有已知弱
NFS使用
本文分享自天翼云开发者社区《》,作者:2m安装nfsnfs依赖于rpc,故需安装nfsutilsrpcbindyuminstallynfsutilsrpcbind​指定nfs监听端口vim/etc/sysconfig/nfs​RQUOTADPORT3000
nginx证书缓存功能
本文分享自天翼云开发者社区《》.作者:云海背景:ssl证书之前是不支持公用的,不同的域名,如果引用同一本证书,是无法公用的,每个域名都要加载同一个证书,浪费内存新版本:在1.27.2版本中,nginx官方更新了ssl证书相关的实现,支持了ssl证书缓存共享
Nginx 缓存的工作原理
本文分享自天翼云开发者社区《》.作者:云海Nginx缓存的工作原理Nginx缓存分为多种类型,最常见的是代理缓存(ProxyCache)。1.代理缓存(ProxyCache)代理缓存的核心原理是:当客户端请求到达Nginx时,Nginx会检查缓存中是否存在
CDN与域名ICP备案的关系浅谈
本文分享自天翼云开发者社区《》.作者:江禄本文介绍CDN与域名ICP备案的关系以及如何进行域名ICP备案。一、CDN与域名ICP备案的关系CDN与域名ICP(InternetContentProvider)备案之间存在着密切的关系,这种关系主要体现在互联网
nginx解决进程内存占用翻倍
本文分享自天翼云开发者社区《》.作者:zn1.问题某天,线上生成环境发现一个问题:某一台机器线上的nginx进程占用的内存是其他机器的2倍,尝试对nginx进行reload后,并没有恢复内存占用翻倍机器:正常机器:2.分析1.每次reload或者启动时wo
天翼云开发者社区
天翼云开发者社区
Lv1
天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。
文章
987
粉丝
16
获赞
40