"); //-->
本文分享自天翼云开发者社区《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

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
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

使用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区分使用不同的协议
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
RFID通讯组件设计与应用
NEC 电子标签解决方案简要介绍
关于串口驱动及中间件的使用--影舞者
基于RapidIO的实时CORBA中间件实现
基于中间件技术的RFID通讯组件设计
RFID中间件软件在RFID系统中的功能和作用
带你认识中间件(Middleware)
ZLG-FS文件系统简要说明
基于ARM的RFID中间件系统设计
ZLG-CF驱动中间件简要说明
新一代数字电视核心优势-操作系统及中间件
支持4G自适应多媒体应用的移动服务中间件开发
中创物联网中间件在智能用电系统应用
中间件能脱器中国软件业的明天?
LPC2131 LPC2131串口中间件的一个问题
瑞萨图像处理硬件加速器中间件
[转帖]平台化与商业化是中间件发展大势所趋
RFID应用集成中间件技术研究与开发
基于SOA的RFID中间件的研究与实现
基于μC/OS—II的μC/IP协议栈在ARM系统中的实现