简介

自从HTTP从1.1升级到了2,一切都变得不同了。虽然HTTP2没有强制说必须使用加密协议进行传输,但是业界的标准包括各大流行的浏览器都只支持HTTPS情况下的HTTP2协议。

那么怎么在HTTPS之中加入HTTP2协议的支持呢?今天本文将会跟大家聊一下SSL/TLS协议的扩展NPN和ALPN。

SSL/TLS协议

SSL(Secure Socket Layer)安全套接层,是1994年由Netscape公司设计的一套协议,并与1995年发布了3.0版本。

TLS(Transport Layer Security)传输层安全是IETF在SSL3.0基础上设计的协议,实际上相当于SSL的后续版本。

SSL/TLS是一种密码通信框架,他是世界上使用最广泛的密码通信方法。

TLS主要分为两层,底层的是TLS记录协议,主要负责使用对称密码对消息进行加密。

上层的是TLS握手协议,主要分为握手协议,密码规格变更协议和应用数据协议4个部分。

其中最重要的就是握手协议,通过客户端和服务器端的交互,和共享一些必要信息,从而生成共享密钥和交互证书。

接下来我们一步步的介绍每一步的含义:

  1. client hello

    客户端向服务器端发送一个client hello的消息,包含下面内容:

    • 可用版本号
    • 当前时间
    • 客户端随机数
    • 会话ID
    • 可用的密码套件清单
    • 可用的压缩方式清单

我们之前提到了TLS其实是一套加密框架,其中的有些组件其实是可以替换的,这里可用版本号,可用的密码套件清单,可用的压缩方式清单就是向服务器询问对方支持哪些服务。

客户端随机数是一个由客户端生成的随机数,用来生成对称密钥。

  1. server hello

    服务器端收到client hello消息后,会向客户端返回一个server hello消息,包含如下内容:

    • 使用的版本号
    • 当前时间
    • 服务器随机数
    • 会话ID
    • 使用的密码套件
    • 使用的压缩方式

使用的版本号,使用的密码套件,使用的压缩方式是对步骤1的回答。

服务器随机数是一个由服务器端生成的随机数,用来生成对称密钥。

  1. 可选步骤:certificate

    服务器端发送自己的证书清单,因为证书可能是层级结构的,所以处理服务器自己的证书之外,还需要发送为服务器签名的证书。

    客户端将会对服务器端的证书进行验证。如果是以匿名的方式通信则不需要证书。

  2. 可选步骤:ServerKeyExchange

    如果第三步的证书信息不足,则可以发送ServerKeyExchange用来构建加密通道。

    ServerKeyExchange的内容可能包含两种形式:

    • 如果选择的是RSA协议,那么传递的就是RSA构建公钥密码的参数(E,N)。我们回想一下RSA中构建公钥的公式:\(密文=明文^E\ mod\ N\), 只要知道了E和N,那么就知道了RSA的公钥,这里传递的就是E,N两个数字。具体内容可以参考RSA算法详解
    • 如果选择的是Diff-Hellman密钥交换协议,那么传递的就是密钥交换的参数,具体内容可以参考更加安全的密钥生成方法Diffie-Hellman
  3. 可选步骤:CertificateRequest

    如果是在一个受限访问的环境,比如fabric中,服务器端也需要向客户端索要证书。

    如果并不需要客户端认证,则不需要此步骤。

  4. server hello done

    服务器端发送server hello done的消息告诉客户端自己的消息结束了。

  5. 可选步骤:Certificate

    对步骤5的回应,客户端发送客户端证书给服务器

  6. ClientKeyExchange

    还是分两种情况:

    • 如果是公钥或者RSA模式情况下,客户端将根据客户端生成的随机数和服务器端生成的随机数,生成预备主密码,通过该公钥进行加密,返送给服务器端。
    • 如果使用的是Diff-Hellman密钥交换协议,则客户端会发送自己这一方要生成Diff-Hellman密钥而需要公开的值。具体内容可以参考更加安全的密钥生成方法Diffie-Hellman,这样服务器端可以根据这个公开值计算出预备主密码。
  7. 可选步骤:CertificateVerify

    客户端向服务器端证明自己是客户端证书的持有者。

  8. ChangeCipherSpec(准备切换密码)

    ChangeCipherSpec是密码规格变更协议的消息,表示后面的消息将会以前面协商过的密钥进行加密。

  9. finished(握手协议结束)

    客户端告诉服务器端握手协议结束了。

  10. ChangeCipherSpec(准备切换密码)

    服务器端告诉客户端自己要切换密码了。

  11. finished(握手协议结束)

    服务器端告诉客户端,握手协议结束了。

  12. 切换到应用数据协议

    这之后服务器和客户端就是以加密的方式进行沟通了。

NPN和ALPN

上面我们介绍SSL/TLS协议的时候,最后一步是切换到应用数据协议,那么客户端是怎么和服务器端讨论协商具体使用哪种应用数据协议呢?是使用HTTP1.1?还是HTTP2?还是SPDY呢?

这里就要用到TLS扩展协议了。而NPN(Next Protocol Negotiation) 和 ALPN (Application Layer Protocol Negotiation) 就是两个TLS的扩展协议。

他们主要用在TLS中,用来协商客户端和服务器端到底应该使用什么应用数据协议进行沟通。

其中NPN是SPDY使用的扩展,而ALPN是HTTP2使用的扩展。

他们两个有什么区别呢?

相较于NPN来说,ALPN在client hello消息中已经列出了客户端支持的应用层协议,服务器端只需要从中选择出它支持的协议即可。比NPN少了一个交互的步骤,所以ALPN是推荐的协议。

下面是具体的交互流程图:

交互的例子

下面以ALPN为例,讲解下具体的交互流程,首先是客户端发送”Client Hello“消息:

    Handshake Type: Client Hello (1)
Length: 141
Version: TLS 1.2 (0x0303)
Random: dd67b5943e5efd0740519f38071008b59efbd68ab3114587...
Session ID Length: 0
Cipher Suites Length: 10
Cipher Suites (5 suites)
Compression Methods Length: 1
Compression Methods (1 method)
Extensions Length: 90
[other extensions omitted]
Extension: application_layer_protocol_negotiation (len=14)
Type: application_layer_protocol_negotiation (16)
Length: 14
ALPN Extension Length: 12
ALPN Protocol
ALPN string length: 2
ALPN Next Protocol: h2
ALPN string length: 8
ALPN Next Protocol: http/1.1

可以看到在client hello消息中的Extension字段中,使用了ALPN,并且列出了可以选择使用的两种ALPN Protocol:h2和http/1.1。

对应的“server hello” 消息会选择出具体使用的ALPN protocol如下:

    Handshake Type: Server Hello (2)
Length: 94
Version: TLS 1.2 (0x0303)
Random: 44e447964d7e8a7d3b404c4748423f02345241dcc9c7e332...
Session ID Length: 32
Session ID: 7667476d1d698d0a90caa1d9a449be814b89a0b52f470e2d...
Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
Compression Method: null (0)
Extensions Length: 22
[other extensions omitted]
Extension: application_layer_protocol_negotiation (len=5)
Type: application_layer_protocol_negotiation (16)
Length: 5
ALPN Extension Length: 3
ALPN Protocol
ALPN string length: 2
ALPN Next Protocol: h2

如上所示,服务器端选择了h2, 最终当客户端和服务器端TLS握手结束之后,会选择使用HTTP2作为后续的应用层数据协议。

总结

NPN和ALPN都是TLS的扩展,相较而言,ALPN更加好用。

本文已收录于 http://www.flydean.com/08-ssl-tls-npn-alpn/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

网络协议之:加密传输中的NPN和ALPN的更多相关文章

  1. TLS 改变密码标准协议(Change Cipher Spec Protocol) 就是加密传输中每隔一段时间必须改变其加解密参数的协议

    SSL修改密文协议的设计目的是为了保障SSL传输过程的安全性,因为SSL协议要求客户端或服务器端每隔一段时间必须改变其加解密参数.当某一方要改变其加解密参数时,就发送一个简单的消息通知对方下一个要传送 ...

  2. 网络协议之rtp---rtp 传输视频及加密

    http://read.pudn.com/downloads170/sourcecode/windows/788977/es%20ParkertTS/ESToTS.cpp__.htm http://w ...

  3. 基于http协议的加密传输方案

    最近公司需要通过公网与其它平台完成接口对接,但是基于开发时间和其它因素的考虑,本次对接无法采用https协议实现.既然不能用https协议,那就退而求其次采用http协议吧! 那么问题来了!在对接的过 ...

  4. 【转】为什么 MQTT 是最适合物联网的网络协议

    初识 MQTT 为什么 MQTT 是最适合物联网的网络协议 Michael Yuan2017 年 6 月 14 日发布 WeiboGoogle+用电子邮件发送本页面 0 物联网 (IoT) 设备必须连 ...

  5. 协议 - OSI七层网络协议模型

    摘自:https://www.cnblogs.com/oneplace/p/5611094.html 互联网协议 本文全文转载阮一峰老师的两篇文章,自己做了一些添加内容 参考:互联网协议入门(一) 互 ...

  6. WCF进阶:扩展bindingElementExtensions支持对称加密传输

      前面两篇文章WCF进阶:将编码后的字节流压缩传输和WCF 进阶: 对称加密传输都是实现了自定义编码,那两个例子中托管服务或者客户端调用都采用的代码实现,WCF更友好的方式是在app.config或 ...

  7. IP协议和网络传输中的封装与分用。

    关于七层模型和四层模型可以参考这个:http://www.cnblogs.com/xcywt/p/5027277.html 因为四层模型用的比较多,这里只拿四层模型来分析. 1.四层模型中的最下层是链 ...

  8. 网络协议 13 - HTTPS 协议:加密路上无尽头

    系列文章传送门: 网络协议 1 - 概述 网络协议 2 - IP 是怎么来,又是怎么没的? 网络协议 3 - 从物理层到 MAC 层 网络协议 4 - 交换机与 VLAN:办公室太复杂,我要回学校 网 ...

  9. 如何为网站启用HTTPS加密传输协议

    前言 当今时代对上网的安全性要求比以前更高,chrome和firefox也都大力支持网站使用HTTPS,苹果也从2017年开始在iOS 10系统中强制app使用HTTPS来传输数据,微信小程序也是要求 ...

随机推荐

  1. Nginx 极简入门教程!(转)

    基本介绍 Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务. Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.r ...

  2. ffmpeg命令 从网络摄像头录制视频

    安装 sudo apt-get install ffmpeg 录制视频为record.mp4文件 ffmpeg -y -i rtsp://cameral_ip:port -vcodec copy -a ...

  3. NX二次开发-使用NXOPEN C++向导模板做二次开发

    版本 NX9+VS2012 1.怎么往VS软件里添加VC,C#,VB向导模板 先到NX安装目录下UGOPEN文件夹里找到这三个文件夹 拷贝到VS的安装目录下 这里有几个注意事项,VS2017,VS20 ...

  4. BUUCTF-[CISCN2019 华北赛区 Day1 Web5]CyberPunk

    BUUCTF-[CISCN2019 华北赛区 Day1 Web5]CyberPunk 看题 看源码有提示?file=? 文件包含漏洞,可以利用这个漏洞读取源码. 分析 index.php?file=p ...

  5. Java的Class类及static块的执行时机

    要理解RTTI在Java中的工作原理,首先必须知道类型信息在运行时是如何表示的,这项工程由Class对象完成,它包含了与类有关的信息.Java使用Class对象来执行其RTTI,即使你执行的是类似转型 ...

  6. 通过WebGoat学习java反序列化漏洞

    首发于freebuff. WebGoat-Insecure Deserialization Insecure Deserialization 01 概念 本课程描述了什么是序列化,以及如何操纵它来执行 ...

  7. HCNP Routing&Switching之OSPF特殊区域

    前文我们了解了OSPF LSA更新规则以及路由汇总相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15231880.html:今天我们来聊一聊OSPF的 ...

  8. 前后端数据交互(五)——什么是 axios?

    一.什么是 axios ? axios是基于 Promise 的 ajax 封装库,也是前端目前最流行的 ajax 请求库.简单地说发送 get.post 请求,是一个轻量级的库,使用时可直接引入. ...

  9. Robot Framework(14)- Variables 表的详细使用和具体例子

    如果你还想从头学起Robot Framework,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1770899.html Variable ...

  10. struts2执行流程和架构图

    一.struts2执行流程 二.架构图 只需要编写黄色部分的代码: