一   背景探究驱动

1) curl校验'证书'有效期方式'有误',导致变更'回退' -->"实际证书替换成功"2)客户端'不支持'SNI["实际版本过低"],导致通过'nginx'转发失败备注:这里'不再描述'具体的案例,只探究'背后的原理'

二   SNI介绍

(1)SNI产生的背景

(2)SNI的概念

TLS握手的过程

1) 服务器名称指示'Server Name Indication,简称SNI'是一个'扩展的TLS'计算机联网协议,在该协议下,在'握手过程开始时'通过'客户端'告诉它正在连接的服务器的'主机(某个虚拟主机)'名称2) 这允许服务器在'相同的IP地址和TCP端口号'上呈现'多个(不同的)证书',并且因此允许在相同的IP地址上提供多个安全HTTPS网站(或其他任何基于TLS的服务),而'不需要'所有这些站点使用'相同'的证书。3)核心过程: 在Client Hello阶段,通过'SNI扩展',将'域名'信息'提前'告诉服务器,服务器根据域名'取得对应的证书返回给客户端'以完成'校验'过程

SNI的发展

二   各种工具对SNI的支持

(1)主流的浏览器  可以理解为客户端工具

(2)curl和wget之类的命令行工具  可以理解为客户端工具

(3)库和编程语言 可以理解为客户端工具

(4)web服务器 可以理解为服务端

三    curl和nginx关于SNI一些细节

 已知的问题:curl和jdk'版本过低(客户端不支持SNI)','导致'ssl握手的'SNI'问题

(1)nginx

SNI 在 'TLSv1.2' 开始'得到支持',从 'OpenSSL 0.9.8' 版本开始支持

yum安装'nginx-1.16.1',默认SNI是'开启的'检查'nginx server端'是否支持SNI扩展协议:'nginx -V'

+++++++++"nginx支持SNI后,每个server_name配置"+++++++++1)单个主机上'nginx多个证书'的配置2)每个'虚拟主机'对应一个,在'不同的server上'配置'ssl_certificate和ssl_certificate_key'即可 

(2)curl

工具版本要求: 'curl 7.18.1' && 'openssl 0.9.8'  可以'支持SNI'curl '7.21.3' 又支持了'–resolve' 参数,可以'直接定位'到IP地址进行访问,对于一个域名'有多个部署节点'的服务来说,这个参数可以'定向的访问某个设备'+++++++++++'相关参数解读'++++++++++++

'不需要修改'/etc/hosts,curl'直接解析'ip请求域名-->省的测试又得'加本地解析'

四    问题1:证书校验方式有问题

(1)背景:匹配哪个server_name? 也即选哪个虚拟主机?

问题的背景:客户端访问的时候,'nginx'侧总是'莫名其妙'的出现一些'404'的报错?

参考链接

How nginx processes a request

强调1:一定是'端口(不指定端口默认是80)'和'server_name'唯一对应'客户端'的这次请求强调2:server_name的'匹配'只与请求中的'Host头'有关,与'url中的主机名'无关

++++++++++++++"案例讲解"++++++++++++++

  参考链接

(2)深入理解Host请求头

①  浏览器测试

说明:浏览器会自动将'gitlab.wzj.com'填充到'Host字段'中  -->'http1.1'的特性

 ②   curl自定义Host测试

最佳实践: postman'自定义Host请求头'测试,这种能'清晰'看到'request'和'response'的一系列信息

1)实验环境的准备

2)curl测试

说明:'curl客户端工具'会自动将'gitlab.wzj.com'填充到'Host字段'中

说明:上面写'错'了, 'GET / HTTP/1.1'代指'请求行',对应nginx内置变量'$request'

3)小结

1) 请求必须先到达'nginx',所以'url'中可以是'ip'或者'域名(该域名解析成此ip即可)'2) server_name中的'域名'不一定要有实际意义,也即'不一定'要能解析、不一定必须得'ping通'

(3) 回归到问题1

1)curl https://www.baidu.com/index.html -v 说明:在'SSL'握手时,会自动将'www.baidu.com'填充到'扩展'信息中2) curl -H 'Host:www.baidu.com' https://172.25.2.100/cert_dates  -->"错误的证书校验方式"说明:会自动将'172.25.2.100'填充到Extension'扩展'信息中,由于nginx没有匹配'172.25.2.100'的server_name备注:会使用默认server_name的证书('第一个'server_name块或者listen指令中有'default_server'的server_name的证书),但是默认server_name的证书'不是'我们替换的证书,所以与预期'不符'3) curl --resolve 'www.baidu.com:443:172.25.2.100' https://www.baidu.com/cert_dates说明:'最佳'实践

++++++++++++"环境准备"++++++++++++前提条件:有一个'默认'证书(这里"不指定"default_server,用第一个域名作为默认证书)和'自定义'另一个域名证书备注:通过二者的'subject中域名(CN)'来辨析'返回'哪个证书附加:最好'两个证书的有效期'不一致,这样测试'更明显'++++++++++++"测试方法"++++++++++++错误的:curl -H 'www.wzj.com:172.25.2.100' http://172.25.2.100/https_cert正确的:curl --resolve www.wzj.com:443:172.25.2.100 https://www.wzj.com/https_cert说明:上述是通过'nginx的一个接口'返回一个'证书的有效期'补充1:--resolve是为了加块'dns解析速度'补充2:Host头是'SSL握手ok,建立HHTP请求'时,nginx 确定请求到达哪个server块下的server_name+++++++++++"输出证书的有效期"+++++++++++openssl x509 -in www.wzh.com.crt -noout –dates

(4)原理

请求过程:client和server'先建立了tcp连接'-->再经过'TLS握手'-->才能实现'https通信'-->进而发送'HTTP请求'备注:也就是在TLS'握手阶段','server端'还'没有'获取七层'HTTP'报文的信息,也即'无法获取'请求头中的'Host'主机头思考: server端是通过'什么(what)'来区分应该返回哪个域名的证书? --> url中的'主机名',而不是请求头中'Host'的主机名工作原理: SSL'协商'阶段,nginx server根据'url 中的主机域名'查找对应'server块中的server_name',将'该证书'返回给'客户端'进行校验

大白鲨抓包看SNI

四    参考博客

HTTPS 深入浅出 - 什么是 SNI?

nginx配置多个TLS证书,以及TLS SNI简介

nginx使用SNI功能的方法

nginx(十)SNI理解相关推荐

  1. java弱引用怎么手动释放,十分钟理解Java中的弱引用,十分钟java引用

    十分钟理解Java中的弱引用,十分钟java引用 本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,帮助大家理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限 ...

  2. 十分钟理解Transformer

    本文转载于知乎文章:十分钟理解Transformer Transformer是一个利用注意力机制来提高模型训练速度的模型.关于注意力机制可以参看这篇文章,trasnformer可以说是完全基于自注意力 ...

  3. java基础(十) 深入理解数组类型

    戳上面的蓝字关注我们哦! 精彩内容 精选java等全套视频教程 精选java电子图书 大数据视频教程精选 java项目练习精选 1. 数组类简介   在java中,数组也是一种引用类型,即是一种类. ...

  4. 十分钟理解线性代数的本质_数学对于编程来说到底有多重要?来看看编程大佬眼里的线性代数!...

    本文提出了一种观点:从应用的角度,我们可以把线性代数视为一门特定领域的程序语言.我们一起来看看!文章有点偏理论讨论,可能比较枯燥,对于一名程序员,你如果看下去,你将会有不一样的收获! 线性代数是什么? ...

  5. Nginx(十九)nginx配置php

    一   了解的基础知识 1) nginx'本身不能'处理PHP,它只是个'web服务器-->只能处理静态请求',当接收到请求后,如果是php请求,则'发给php解释器处理',并把结果返回给'we ...

  6. 十分钟理解Java泛型擦除

    泛型信息只存在于代码编译阶段,但是在java的运行期(已经生成字节码文件后)与泛型相关的信息会被擦除掉,专业术语叫做类型擦除. 今天我们来讲解泛型中另一个重要知识点--泛型擦除! 泛型擦除概念 泛型信 ...

  7. nginx try_files的理解

    以 try_files $uri $uri/ /index.php; 为例,当用户请求 http://servers.blog.ustc.edu.cn/example 时,这里的 $uri 就是 /e ...

  8. 聊聊高并发(二十八)解析java.util.concurrent各个组件(十) 理解ReentrantReadWriteLock可重入读-写锁

    这篇讲讲ReentrantReadWriteLock可重入读写锁,它不仅是读写锁的实现,并且支持可重入性. 聊聊高并发(十五)实现一个简单的读-写锁(共享-排他锁) 这篇讲了如何模拟一个读写锁. 可重 ...

  9. 【软件开发底层知识修炼】二十 深入理解可执行程序的结构

    上一篇文章记录了GDB调试从入门到熟练掌握的学习全过程.点击链接查看:[软件开发底层知识修炼]十九 GDB调试从入门到熟练掌握超级详细实战教程学习目录 还记得在以前的学习Binutils工具的时候,学 ...

最新文章

  1. Android 懒加载
  2. g++配置选项-std=c++11
  3. python【蓝桥杯vip练习题库】ADV-136大数加法(高精度加法)
  4. CodeAction_beta02 斐波那契 (多维DP)
  5. .NET Core程序瘦身器发布,压缩程序尺寸到1/3
  6. echo “1“ > /proc/sys/net/ipv4/ip_forward(数据包转发)
  7. Linux下创建Oracle的实例
  8. 用计算机充手机吗,电脑充电器可以充手机吗
  9. 错误: 找不到或无法加载主类
  10. Linux线程同步介绍和示例
  11. 监控PGA最大空间、分配
  12. OpenCV编程-无法解析的外部符号 void __cdecl cv::cvtColor
  13. java字符相似_JAVA 获取两个字符串的相似度
  14. 在苹果Mac中如何将html网页转成PDF文件?
  15. 指尖上的学问——wi输入法开发实记
  16. 【FPGA从0开始系列】黑金EP4CE10F17C8开发板按键实验(二)
  17. FIFO调度算法和LRU算法
  18. python-基站位置查询
  19. 软件模拟中美gdp今后几年的变化情况
  20. 《天天学敏捷:Scrum团队转型记》读书笔记

热门文章

  1. JavaSE-java.io.File类
  2. Java版碰撞球游戏
  3. 《深入理解计算机系统》(CSAPP)读书笔记 —— 第二章 信息的表示和处理
  4. W800开发板开箱初体验
  5. 如何使用JS实现一个录屏功能
  6. 分析kMeans、二分K-Means算法及肘部法则
  7. 深搜6:【SSL】1328.泡泡龙——2021-05-01更
  8. 警告: Exception encountered during context initialization - cancelling refresh attempt:
  9. php larval workerman,laravel框架与workerman的整合
  10. JNI_OnLoad 与 JNI_OnUnload