Chinaunix首页 | 论坛 | 博客
  • 博客访问: 546179
  • 博文数量: 911
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 7395
  • 用 户 组: 普通用户
  • 注册时间: 2022-03-07 15:28
个人简介

天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。

文章分类

全部博文(911)

文章存档

2026年(14)

2025年(202)

2024年(244)

2023年(247)

2022年(202)

我的朋友

分类: 云计算

2025-12-04 18:17:26

本文分享自天翼云开发者社区《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
        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
        ssl_protocols       TLSv1.2  TLSv1.3;
        ssl_certificate         ssl/b.crt;
        ssl_certificate_key     ssl/b.key;
        location / {
            return 200 ok;
        }
    }
}

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

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

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

2.原理

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

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

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

3.第三方模块

使用github上模块 

修改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
        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
        ssl_protocols       TLSv1.2  TLSv1.3;
        ssl_certificate         ssl/b.crt;
        ssl_certificate_key     ssl/b.key;
        location / {
            return 200 ok;
        }
    }
}


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


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

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

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


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

阅读(1) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~