全⾯了解HTTP和HTTPS
序⾔
Http和Https属于计算机⽹络范畴,但作为开发⼈员,不管是后台开发或是前台开发,都很有必要掌握它们。
在学习Http和Https的过程中,主要是参考了,讲的很全⾯,并且通俗易懂,有兴趣的同学可以去学习学习。
这篇⽂章主要是按照⾃⼰的思路来讲解对Http和Https的理解。⽂章将会从以下⼏个⽅⾯介绍。
⽬录树(暂时还不知道简书编辑器怎么通过⽬录树进⾏页⾯内跳转,哪位同学知道希望不吝告知):
⼀、⽹络层结构
⼆、Http协议
三、Tcp三次握⼿
四、Https协议/SSL协议
五、SSL证书
六、RSA加密和DH加密
七、Http和Https对⽐
从⽬录结构可以看出,每个标题展开来说都是⼀个很⼤的主题。但本⽂旨在让各位同学对Http和Https相关知识有⼀个全⾯的认知,不会太过深⼊探讨各个主题,有兴趣的同学可
以进⾏针对性研究。
⼀、⽹络层结构
⽹络结构有两种主流的分层⽅式:OSI七层模型和TCP/IP四层模型。
OSI七层模型和TCP/IP四层模型
OSI是指Open System Interconnect,意为开放式系统互联。
TCP/IP是指传输控制协议/⽹间协议,是⽬前世界上应⽤最⼴的协议。
OSI层对应TCP/IP层OSI各层功能⽹络协议设备
应⽤层应⽤层应⽤程序(电⼦邮件,⽂件服务),⽤户接⼝HTTP,FTP,TFTP,NFS⽹关
表⽰层应⽤层数据的表⽰,压缩和加密(数据格式化,代码转换,数据加密)TELNET,SNMP⽹关
会话层应⽤层建⽴、管理和终⽌会话SMTP,DNS⽹关
传输层传输层提供端到端可靠报⽂段传递和错误恢复TCP,UDP⽹关
⽹络层⽹际互联层提供数据包从源到宿的传递和⽹际交互IP,ICMP,ARP,RARP,UUCP路由器
链路层⽹络接⼝层将⽐特组装成帧和点到点传递FDDI,SLIP,PPP,PDN交换机
物理层⽹络接⼝层传输⽐特流,以⼆进制数据形式在物理媒体上传输数据ISO2110,IEEE802,IEEE802.2集线器,中继器
两种模型区别
1. OSI采⽤七层模型,TCP/IP是四层模型
2. TCP/IP⽹络接⼝层没有真正的定义,只是概念性的描述。OSI把它分为2层,每⼀层功能详尽。
3. 在协议开发之前,就有了OSI模型,所以OSI模型具有共通性,⽽TCP/IP是基于协议建⽴的模型,不适⽤于⾮TCP/IP的⽹络。
4. 实际应⽤中,OSI模型是理论上的模型,没有成熟的产品;⽽TCP/IP已经成为国际标准。
⼆、HTTP协议
Http是基于TCP/IP协议的应⽤程序协议,不包括数据包的传输,主要规定了客户端和服务器的通信格式,默认使⽤80端⼝。
Http协议的发展历史
1. 1991年发布Http/0.9版本,只有Get命令,且服务端直返HTML格式字符串,服务器响应完毕就关闭TCP连接。
2. 1996年发布Http/1.0版本,优点:可以发送任何格式内容,包括⽂字、图像、视频、⼆进制。也丰富了命令Get,Post,Head。请求和响应的格式加⼊头信息。缺点:每个
TCP连接只能发送⼀个请求,⽽新建TCP连接的成本很⾼,导致Http/1.0新能很差。
3. 1997发布Http/1.1版本,完善了Http协议,直⾄20年后的今天仍是最流⾏的版本。
优点:a. 引⼊持久连接,TCP默认不关闭,可被多个请求复⽤,对于⼀个域名,多数浏览器允许同时建⽴6个持久连接。b. 引⼊管道机制,即在同⼀个TCP连接中,可以同
时发送多个请求,不过服务器还是按顺序响应。c. 在头部加⼊Content-Length字段,⼀个TCP可以同时传送多个响应,所以就需要该字段来区分哪些内容属于哪个响应。d.
分块传输编码,对于耗时的动态操作,⽤流模式取代缓存模式,即产⽣⼀块数据,就发送⼀块数据。e. 增加了许多命令,头信息增加Host来指定服务器域名,可以访问⼀台
服务器上的不同⽹站。
缺点:TCP连接中的响应有顺序,服务器处理完⼀个回应才能处理下⼀个回应,如果某个回应特别慢,后⾯的请求就会排队等着(对头堵塞)。
4. 2015年发布Http/2版本,它有⼏个特性:⼆进制协议、多⼯、数据流、头信息压缩、服务器推送。
Http请求和响应格式
Request格式:
GET /barite/account/stock/groups HTTP/1.1
QUARTZ-SESSION: MC4xMDQ0NjA3NTI0Mzc0MjAyNg.VPXuA8rxTghcZlRCfiAwZlAIdCA
DEVICE-TYPE: ANDROID
API-VERSION: 15
Host: shitouji.bluestonehk
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.10.0
Response格式:
HTTP/1.1 200 OK
Server: nginx/1.6.3
Date: Mon, 15 Oct 2018 03:30:28 GMT
Content-Type: application/json;charset=UTF-8
Pragma: no-cache
Cache-Control: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Content-Encoding: gzip
Transfer-Encoding: chunked
Proxy-Connection: Keep-alive
{"errno":0,"dialogInfo":null,"body":{"list":[{"flag":2,"group_id":1557,"group_name":"港股","count":1},{"flag":3,"group_id":1558,"group_name":"美股","count":7},{"flag":1,"group_id":1556,"group_name":"全部","count":8}]},"message":"success"}说明⼀下请求头和响应头的部分字段:
Host:指定服务器域名,可⽤来区分访问⼀个服务器上的不同服务
Connection:keep-alive表⽰要求服务器不要关闭TCP连接,close表⽰明确要求关闭连接,默认值是k
eep-alive
Accept-Encoding:说明⾃⼰可以接收的压缩⽅式
User-Agent:⽤户代理,是服务器能识别客户端的操作系统(Android、IOS、WEB)及相关的信息。作⽤是帮助服务器区分客户端,并且针对不同客户端让⽤户看到不同数
据,做不同操作。
Content-Type:服务器告诉客户端数据的格式,常见的值有text/plain,image/jpeg,image/png,video/mp4,application/json,application/zip。这些数据类型总称为MIME TYPE。
Content-Encoding:服务器数据压缩⽅式
Transfer-Encoding:chunked表⽰采⽤分块传输编码,有该字段则⽆需使⽤Content-Length字段。
Content-Length:声明数据的长度,请求和回应头部都可以使⽤该字段。
Tcp三次握⼿
Http和Https协议请求时都会通过Tcp三次握⼿建⽴Tcp连接。那么,三次握⼿是指什么呢?
image.png
那么,为什么⼀定要三次握⼿呢,⼀次可以吗?两次可以吗?带着这些问题,我们来分析⼀下为什么必须是三次握⼿。
1. 第⼀次握⼿,A向B发送信息后,B收到信息。B可确认A的发信能⼒和B的收信能⼒
2. 第⼆次握⼿,B向A发消息,A收到消息。A可确认A的发信能⼒和收信能⼒,A也可确认B的收信能⼒和发信能⼒
3. 第三次握⼿,A向B发送消息,B接收到消息。B可确认A的收信能⼒和B的发信能⼒
通过三次握⼿,A和B都能确认⾃⼰和对⽅的收发信能⼒,相当于建⽴了互相的信任,就可以开始通信了。
下⾯,我们介绍⼀下三次握⼿具体发送的内容,⽤⼀张图描述如下:
image.png
⾸先,介绍⼀下⼏个概念:
ACK:响应标识,1表⽰响应,连接建⽴成功之后,所有报⽂段ACK的值都为1
SYN:连接标识,1表⽰建⽴连接,连接请求和连接接受报⽂段SYN=1,其他情况都是0
FIN:关闭连接标识,1标识关闭连接,关闭请求和关闭接受报⽂段FIN=1,其他情况都是0,跟SYN类似
seq number:序号,⼀个随机数X,请求报⽂段中会有该字段,响应报⽂段没有
ack number:应答号,值为请求seq+1,即X+1,除了连接请求和连接接受响应报⽂段没有该字段,其他的报⽂段都有该字段
知道了上⾯⼏个概念后,看⼀下三次握⼿的具体流程:
1. 第⼀次握⼿:建⽴连接请求。客户端发送连接请求报⽂段,将SYN置为1,seq为随机数x。然后,客户端进⼊SYN_SEND状态,等待服务器确认。
2. 第⼆次握⼿:确认连接请求。服务器收到客户端的SYN报⽂段,需要对该请求进⾏确认,设置ack=x+1(即客户端seq+1)。同时⾃⼰也要发送SYN请求信息,即SYN置为
1,seq=y。服务器将SYN和ACK信息放在⼀个报⽂段中,⼀并发送给客户端,服务器进⼊SYN_RECV状态。
3. 第三次握⼿:客户端收到SYN+ACK报⽂段,将ack设置为y+1,向服务器发送ACK报⽂段,这个报⽂段发送完毕,客户端和服务券进⼊ESTABLISHED状态,完成Tcp三次
握⼿。
从图中可以看出,建⽴连接经历了三次握⼿,当数据传输完毕,需要断开连接,⽽断开连接经历了四次挥⼿:
1. 第⼀次挥⼿:主机1(可以是客户端或服务器),设置seq和ack向主机2发送⼀个FIN报⽂段,此时主机1进⼊FIN_WAIT_1状态,表⽰没有数据要发送给主机2了
2. 第⼆次挥⼿:主机2收到主机1的FIN报⽂段,向主机1回应⼀个ACK报⽂段,表⽰同意关闭请求,主机1进⼊FIN_WAIT_2状态。
3. 第三次挥⼿:主机2向主机1发送FIN报⽂段,请求关闭连接,主机2进⼊LAST_ACK状态。
4. 第四次挥⼿:主机1收到主机2的FIN报⽂段,想主机2回应ACK报⽂段,然后主机1进⼊TIME_WAIT状态;主机2收到主机1的ACK报⽂段后,关闭连接。此时主机1等待主
机2⼀段时间后,没有收到回复,证明主机2已经正常关闭,主机1页关闭连接。
下⾯是Tcp报⽂段⾸部格式图,对于理解Tcp协议很重要:
image.png
Https协议/SSL协议
Https协议是以安全为⽬标的Http通道,简单来说就是Http的安全版。主要是在Http下加⼊SSL层(现在主流的是SLL/TLS),SSL是Https协议的安全基础。Https默认端⼝号为443。
前⾯介绍了Http协议,各位同学能说出Http存在的风险吗?
1. 窃听风险:Http采⽤明⽂传输数据,第三⽅可以获知通信内容
2. 篡改风险:第三⽅可以修改通信内容
3. 冒充风险:第三⽅可以冒充他⼈⾝份进⾏通信
SSL/TLS协议就是为了解决这些风险⽽设计,希望达到:
1. 所有信息加密传输,三⽅窃听通信内容
2. 具有校验机制,内容⼀旦被篡改,通信双发⽴刻会发现
3. 配备⾝份证书,防⽌⾝份被冒充
下⾯主要介绍SSL/TLS协议。
SSL发展史(互联⽹加密通信)
1. 1994年NetSpace公司设计SSL协议(Secure Sockets Layout)1.0版本,但未发布。
2. 1995年NetSpace发布SSL/2.0版本,很快发现有严重漏洞
3. 1996年发布SSL/3.0版本,得到⼤规模应⽤
4. 1999年,发布了SSL升级版TLS/1.0版本,⽬前应⽤最⼴泛的版本
5. 2006年和2008年,发布了TLS/1.1版本和TLS/1.2版本
SSL原理及运⾏过程
nginx和网关怎么配合使用SSL/TLS协议基本思路是采⽤公钥加密法(最有名的是RSA加密算法)。⼤概流程是,客户端向服务
器索要公钥,然后⽤公钥加密信息,服务器收到密⽂,⽤⾃⼰的私钥解密。为了防⽌公钥被篡改,把公钥放在数字证书中,证书可信则公钥可信。公钥加密计算量很⼤,为了提⾼效率,服务端和客户端都⽣成对话秘钥,⽤它加密信息,⽽对话秘钥是对称加密,速度⾮常快。⽽公钥⽤来机密对话秘钥。
下⾯⽤⼀张图表⽰SSL加密传输过程:
image.png
详细介绍⼀下图中过程:
1. 客户端给出协议版本号、⼀个客户端随机数A(Client random)以及客户端⽀持的加密⽅式
2. 服务端确认双⽅使⽤的加密⽅式,并给出数字证书、⼀个服务器⽣成的随机数B(Server random)
3. 客户端确认数字证书有效,⽣成⼀个新的随机数C(Pre-master-secret),使⽤证书中的公钥对C加密,发送给服务端
4. 服务端使⽤⾃⼰的私钥解密出C
5. 客户端和服务器根据约定的加密⽅法,使⽤三个随机数ABC,⽣成对话秘钥,之后的通信都⽤这个对话秘钥进⾏加密。
SSL证书
上⾯提到了,Https协议中需要使⽤到SSL证书。
SSL证书是⼀个⼆进制⽂件,⾥⾯包含经过认证的⽹站公钥和⼀些元数据,需要从经销商购买。
证书有很多类型,按认证级别分类:
域名认证(DV=Domain Validation):最低级别的认证,可以确认申请⼈拥有这个域名
公司认证(OV=Organization Validation):确认域名所有⼈是哪家公司,证书⾥⾯包含公司的信息
扩展认证(EV=Extended Validation):最⾼级别认证,浏览器地址栏会显⽰公司名称。
EV证书浏览器地址栏样式:
image.png
OV证书浏览器地址栏样式:
image.png
DV证书浏览器样式:
image.png
按覆盖范围分类:
单域名证书:只能⽤于单域名,证书不能⽤不
通配符证书:可⽤于某个域名及所有⼀级⼦域名,⽐如*的证书可⽤于,也可⽤于
多域名证书:可⽤于多个域名,⽐如foo和bar
认证级别越⾼,覆盖范围越⼴的证书,价格越贵。也有免费的证书,为了推⼴Https,电⼦前哨基⾦会成⽴了提供免费证书。
证书的经销商也很多,知名度⽐较⾼的有。
RSA加密和DH加密
加密算法分类
加密算法分为对称加密、⾮对称加密和Hash加密算法。
对称加密:甲⽅和⼄⽅使⽤同⼀种加密规则对信息加解密
⾮对称加密:⼄⽅⽣成两把秘钥(公钥和私钥)。公钥是公开的,任何⼈都可以获取,私钥是保密的,只存在于⼄⽅⼿中。甲⽅获取公钥,然后⽤公钥加密信息,⼄⽅得到密⽂后,⽤私钥解密。
Hash加密:Hash算法是⼀种单向密码体制,即只有加密过程,没有解密过程
对称加密算法加解密效率⾼,速度快,适合⼤数据量加解密。常见的堆成加密算法有DES、AES、RC5、Blowfish、IDEA
⾮对称加密算法复杂,加解密速度慢,但安全性⾼,⼀般与对称加密结合使⽤(对称加密通信内容,⾮对称加密对称秘钥)。常见的⾮对称加密算法有RSA、DH、DSA、ECC Hash算法特性是:输⼊值⼀样,经过哈希函数得到相同的散列值,但并⾮散列值相同则输⼊值也相同。常见的Hash加密算法有MD5、SHA-1、SHA-X系列
下⾯着重介绍⼀下RSA算法和DH算法。
RSA加密算法
Https协议就是使⽤RSA加密算法,可以说RSA加密算法是宇宙中最重要的加密算法。
RSA算法⽤到⼀些数论知识,包括互质关系,欧拉函数,欧拉定理。此处不具体介绍加密的过程,如果有兴趣,可以参照。
RSA算法的安全保障基于⼤数分解问题,⽬前破解过的最⼤秘钥是700+位,也就代表1024位秘钥和2048位秘钥可以认为绝对安全。
⼤数分解主要难点在于计算能⼒,如果未来计算能⼒有了质的提升,那么这些秘钥也是有可能被破解的。
DH加密算法
DH也是⼀种⾮对称加密算法,。
DH算法的安全保障是基于离散对数问题。
Http协议和Https协议的对⽐
Http和Https的区别如下:
https协议需要到CA申请证书,⼤多数情况下需要⼀定费⽤
Http是超⽂本传输协议,信息采⽤明⽂传输,Https则是具有安全性SSL加密传输协议
Http和Https端⼝号不⼀样,Http是80端⼝,Https是443端⼝
Http连接是⽆状态的,⽽Https采⽤Http+SSL构建可进⾏加密传输、⾝份认证的⽹络协议,更安全。
Http协议建⽴连接的过程⽐Https协议快。因为Https除了Tcp三次握⼿,还要经过SSL握⼿。连接建⽴之后数据传输速度,⼆者⽆明显区别。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。