HTTPS那些协议:TLS, SSL, SNI, ALPN, NPN

  • 时间:
  • 浏览:4
  • 来源:熊猫辅助网_提供洋葱娱乐网技术_梅花辅助网资讯

如今 HTTPS 不可能 普遍应用了,在带来安全性的一起也人太好给 Web 引入了更多错综复杂的概念。这其中就包括一系列从没见过的网络协议。现在 Harttle 从 HTTPS 的原理出发,尝试以最通俗的最好的方法来解读 HTTPS 涉及的那先 协议。

HTTPS 概要

HTTPS 是建立在安全通信之上的 HTTP,使用传输层加密(TLS 或 SSL)的手段。其目的是保护用户隐私(比如补救经过的网络节点截获 HTTP 内容)和数据删剪性(比如运营商强插广告),就是 端到端加密来补救底下人攻击。

TLS/SSL 是在传输层之上应用层之下的协议,只要 HTTP 协议的内容不受影响。那先 加密采用非对称加密算法只要时需一有有俩个官方来发布公钥,这就是 密钥基础设施(CA)。只要各浏览器会内置一点 CA 的根证书,那先 CA 还可以 进一步授权一点的域名,原本你的浏览器就还可以 对正在访问的域名进行身份认证。

不可能 我就此人 的服务也支持 HTTPS 去 CA 注册此人 的域名就还可以 了。有一点免费的 CA 比如 GoDaddy, Let’s Encrypt, CloudFlare 等还可以 选择。

HTTPS 交互示例

以下 Wireshark 日志记录了一有有俩个发往 https://github.com/harttle 的 GET 请求,还可以 想看 主要的几次协议的交互过程:

  • TCP。前三行完成一对 SYN/ACK(即俗称的三次握手),至此 TCP 连接不可能 成功建立。
  • TLS。4-5 行始于英语 了 TLS 握手,建立你类式加密层。
  • TLS 有众多扩展协议比如 SNI,NPN,ALPN 等(见下文),就存在在 TLS 的 ClientHello 和 ServerHello 阶段。

TLS/SSL

TLS 的前身是 SSL,TCP/IP 协议栈中运行在 TCP 之上,用来交换密钥并形成一有有俩个加密层(Record Layer)。 TLS 是 HTTPS 的核心协议,HTTPS 交互与 HTTP 交互的主要区别就在你类式层:

始于英语 传输密文前时需进行互换密钥、验证服务器证书等准备工作,只要 TLS 也存在握手阶段,主要步骤为:客户端发送 ClientHello,服务器发送 ServerHello,服务器继续发送 Certificate,只要互相发送 KeyExchange 消息,最后发送 ChangeCipherSpec 来通知对方后续时需密文。具体交互和协议字段请参考 RFC 5246(TLSv1.2)和 RFC 6176(TLSv2.0)。

TLS 作为 TCP/IP 协议栈中的加密协议有广泛的用途,为支持通用机制的协议扩展,定义了 RFC 4366 - TLS Extensions。 TLS 先后被邮件服务、Web 服务、FTP 等采用,这里一有有俩个 扩展协议列表。

本文关注其中 Web 服务(HTTPS)相关的扩展,如 SNI, NPN, ALPN。那先 协议通过扩展 TLS 的 ClientHello/ServerHello 消息为 TLS 增加新的功能。为此大伙儿儿先看一下 ClientHello 消息的内部管理(ServerHello 类式):

  1. struct { 
  2.     ProtocolVersion client_version; 
  3.     Random random; 
  4.     SessionID session_id; 
  5.     CipherSuite cipher_suites<2..2^16-2>; 
  6.     CompressionMethod compression_methods<1..2^8-1>; 
  7.     select (extensions_present) { 
  8.         case false
  9.             struct {}; 
  10.         case true
  11.             Extension extensions<0..2^16-1>; 
  12.     }; 
  13. } ClientHello; 

注意最后一有有俩个字段,最多还可以 有 65536 个 Extension,其中 Extension 定义为一有有俩个两字节的 ExtensionType 以及对应的不透明数据。下文的 SNI,NPN,ALPN 时需其中之一。

SNI

SNI(Server Name Indication)指定了 TLS 握手时需连接的 主机名。 SNI 协议是为了支持同一有有俩个 IP(和端口)支持多个域名。

不可能 在 TLS 握手期间服务器时需发送证书(Certificate)给客户端,为此时需知道客户请求的域名(不可能 不同域名的证书不可能 是不一样的)。这时有同学要问了,要连接的主机名不就是 发起 HTTP 时的 Host 么!这是对 HTTPS 机制的误解,TLS Handshake 存在时 HTTP 交互还没始于英语 ,自然 HTTP 头部还没到达服务器。SNI 协议就定义在 RFC 20066 中:

  1. struct { 
  2.     NameType name_type; 
  3.     select (name_type) { 
  4.         case host_name: HostName; 
  5.     } name
  6. } ServerName; 
  7.  
  8. enum { 
  9.     host_name(0), (255) 
  10. } NameType; 
  11.  
  12. opaque HostName<1..2^16-1>; 
  13. struct { 
  14.     ServerName server_name_list<1..2^16-1> 
  15. } ServerNameList; 

大伙儿儿看本文刚始于英语 的例子,第4行发往 github.com 的 ClientHello 中的 SNI Extension 字段:

  1. Extension Header     ||            Extension Payload (SNI) 
  2.  
  3. ExtensionType Length || PayloadLength Type      ServerLength ServerName 
  4.  
  5. 00 00         00 0f  00 0d            00        00 0a        67 69 74 68 75 62 2e 63 6f 6d 
  6. sni(0)        15     || 13            host_name 10           github.com 

ALPN/NPN

ALPN(Application-Layer Protocol Negotiation)也是 TLS 层的扩展,用于协商应用层使用的协议。它的前身是 NPN,最初用于支持 Google SPDY 协议(现已标准化为 HTTP/2)。 TLS 客户端和服务器版本的现象图片,意味着着 SPDY->HTTP/2 和 NPN -> ALPN 的切换过程引发了不少阵痛:

  • The day Google Chrome disables HTTP/2
  • 从启用 HTTP/2 意味着着网站无法访问说起

只要 以标准先行的最好的方法来推进 Web 基础设施 已成为今日 Web 平台的共识。这里大伙儿儿不提那先 仍然在进行作坊式生产的(类)浏览器厂商,任何阻挡 Web 平台发展的实现(甚至标准,试看 XHTML, OSI…)迟早会被淘汰。

言归正传,ALPN 定义在 RFC 72001 - Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension,

  1. enum { 
  2.     application_layer_protocol_negotiation(16), (65535) 
  3. } ExtensionType; 
  4.  
  5. opaque ProtocolName<1..2^8-1>; 
  6.  
  7. struct { 
  8.     ProtocolName protocol_name_list<2..2^16-1> 
  9. } ProtocolNameList; 

大伙儿儿看本文刚始于英语 的例子,第4行发往 github.com 的 ClientHello 中的 ALPN Extension 字段:

  1. Extension Header     ||            Extention Payload (ALPN) 
  2.  
  3. ExtensionType Length || PayloadLength StringLength Protocol StringLength Protocol 
  4.  
  5. 00 10         00 0e  00 0c            02           68 32    08           68 74 74 70 2f 31 2e 31 
  6. alpn(16)      14     || 12            2            h2       8            http/1.1 

Extention 的消息体暗含多个字符串(protocol_name_list),表示客户端支持的所有应用层协议。底下的例子暗含 h2 和 http/1.1 一有有俩个,支持 SPDY 的客户端这里会多一有有俩个 spdy/2。服务器给出的 ServerHello 中时需选择其中之一,本文的例子中 ServerHello 的 ALPN 字段为:

  1. 00 10 00 0b 00 09 08 68 74 74 70 2f 31 2e 31 
  2.                      h  t  t  p  /  1  .  1 

原本 Server 和 Client 就利用 ALPN 协议达成了共识,不可能 在握手始于英语 后使用 HTTP/1.1 协议进行通信。

参考和致谢

从 HTTPS 的关键一层 TLS 始于英语 ,介绍了一有有俩个典型的 HTTPS 交互过程。结合抓包给出的字节序列,依次介绍了 TLS、SNI、ALPN 等协议原理和主要内容。

【编辑推荐】

【责任编辑:

未丽燕

TEL:(010)684762006】



点赞 0

猜你喜欢

DHCP攻击,高手请进!

我们都都的网络设置好了只有自动获得IP(即192.168.1.0的网段)的不能上网,统统内网也有 人利用DHCP来攻击了(开一下DHCP服务器,IP段是192.168.0.0

2019-07-16

纯64位版浏览器:Waterfox水狐浏览器 | 张戈博客

近期博主将一些人的本本的内存从2G升级到4G,勉勉强强实现了不正规双通道(CPU-Z检测成功)。为了最大程度地发挥这6G的性能,博主又将系统升级到了64位Windows7专业版

2019-07-16

王者荣耀更新慢是怎么回事 王者荣耀更新慢怎么办

时间:2019/6/249:13:00阅读(0)次精选答案王者荣耀更新慢原因分析1.网络不稳定,下载下行速率 慢原因分析更新慢。2.游戏更新包体越多,需下载血块内容原因分析更

2019-07-16

华晨雷诺金杯 里程王者 小游戏互动赢取微信红包

活动介绍:微信华晨雷诺金杯举办的里程王者小游戏互动活动,活动期间,关注官方微信号华晨雷诺金杯 点击菜单栏:尊享服务-参与游戏 进入微信内活动页面,参与小游戏活动,完成后可不不需

2019-07-16

cf末路狂飙新地图介绍 挑战模式新地图末路狂飙图片欣赏

cf末路狂飙新地图将会出来了,伙伴们是都是 很想知道你是什么新地图为什样或是为什玩呢?下面腾讯爱好者小编就带大伙儿共同来看看吧! cf末路狂飙(挑战)虽然‘炽天使’之战极为艰

2019-07-16