http简介
HTTP通信过程:
三大阶段:
建立连接阶段,tcp三次握手
数据传输阶段,http明文传输
释放连接阶段,tcp四次挥手
HTTP请求和响应的7个步骤:
HTTP三大弊端:
- 被监听
http通信都是明文,数据在客户端与服务器通信过程中,任何一点都可能被劫持 - 被伪装
http通信时,无法保证通行双方是合法的,通信方可能是伪装的。 - 被篡改
hacker中间篡改数据后,接收方并不知道数据已经被更改
几个概念
tls和ssl
https并非应用层的一种新协议,而是在http通信接口部分用SSL(Secure Socket Layer:安全套接字层)和TLS(Transport Layer Security:安全层传输协议)协议代替
SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。
TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。
SSL是Netscape开发的专门用户保护Web通讯的,目前版本为3.0。最新版本的TLS 1.0是IETF(工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。两者差别极小,可以理解为SSL 3.1,它是写入了RFC的。
通常,http和TCP直接通信,当使用SSL时,先由http和SSL通信,再由SSL和TCP通信SSL是独立于http的协议,其他应用层的如SMTP何Telnet等协议都可以配合SSL进行使用
https拆成tcp/tls/http这三层来看,tcp handshake >> tls(ssl) handshake >> http request/response
tcp三次握手后,在tls协商加密算法,最后才通信
名词解析
秘钥:
公钥密码体制分为三个部分,公钥、私钥、加密解密算法,它的加密解密过程如下:
加密:通过加密算法和公钥对内容(或者说明文)进行加密,得到密文。加密过程需要用到公钥。
解密:通过解密算法和私钥对密文进行解密,得到明文。解密过程需要用到解密算法和私钥。
注意,由公钥加密的内容,只能由私钥进行解密,也就是说,由公钥加密的内容,如果不知道私 钥,是无法解密的。
公钥密码体制的公钥和算法都是公开的(这是为什么叫公钥密码体制的原因),私钥是保密的。大家都以使用公钥进行加密,但是只有私钥的持有者才能解密。在实际的使用中,有需要的人会生成一对公钥和私钥,把公钥发布出去给别人使用,自己保留私钥。
证书:
由数字证书认证机构(CA:Certificate Authority)和其他相关机关颁发的公开密钥证书
处于客户端和服务器双方都可信赖的第三方机构立场,对通过申请的服务器公开密钥做数字签名,分配该公开密钥,将其与共钥证书绑定,然后服务器传给客户端,以进行公开密钥加密方式通信;
收到证书的客户端使用数字证书认证机构的公开密钥,对服务器证书的数字签名进行认证,然后明确2点:
①.认证服务器的公开密钥是真实有效的数字证书认证机构
②.服务器的公开密钥是指的信赖的
作用:
①.证明通信方的服务器是否规范
②.确认对方服务器背后运营的企业是否真实存在(拥有该功能的证书就是EV SSL证书:Extended Validation SSL Cetificate );特点:浏览器背景色是绿色的
https如何解决http的弊端:
- 所有信息都是加密传播,第三方无法窃听。
- 具有校验机制,一旦被篡改,通信双方会立刻发现。
- 配备身份证书,防止身份被冒充。
SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。
但是,这里有两个问题:
- 如何保证公钥不被篡改?
解决方法:将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。 - 公钥加密计算量太大,如何减少耗用的时间?
解决方法:每一次对话(session),客户端和服务器端都生成一个"对话密钥"(session key),用它来加密信息。由于"对话密钥"是对称加密,所以运算速度非常快,而服务器公钥只用于加密"对话密钥"本身,这样就减少了加密运算的消耗时间。
SSL/TLS
SSL/TLS握手过程可以分成两种类型:
- SSL/TLS 双向认证,就是双方都会互相认证,也就是两者之间将会交换证书。
- SSL/TLS 单向认证,客户端会认证服务器端身份,而服务器端不会去对客户端身份进行验证。
单向认证:
单向认证流程:
-
客户端向服务端发送SSL协议版本号、客户端支持的加密算法种类、客户端生成的随机数等信息。
-
服务端给客户端返回SSL协议版本号、采取的支持加密算法种类、服务端生成的随机数等信息,同时也返回服务器端的数字证书,证书包含(公钥)
实例: -
客户端使用服务端返回的信息验证服务器的合法性,包括:
证书是否过期
发型服务器证书的CA是否可靠
返回的公钥是否能正确解开返回证书中的数字签名
服务器证书上的域名是否和服务器的实际域名相匹配
验证通过后,将继续进行通信,否则,终止通信
客户端如何验证数字证书呢?
- 客户端(浏览器)内预置了根证书
- CA下发给网站的证书都是一个证书链,也就是一层一层的证书,从根证书开始,到下级CA,一层一层,最后一层就是网站证书。
- 证书的签名是通过签名算法和上级CA的私钥生成的
- 浏览器需要用上级CA的公钥才能解密签名,并与生成的指纹对比
- 证书链由多个证书一层一层组成的,除了最底层的网站证书的公钥是给用户加密报文外,其他层证书中的公钥均用于解密底层的证书指纹签名
- 最高层的根证书是自签名的,也就是自己颁发给自己,所以它的公钥不仅用来解密下层的签名,也用来给自己的签名解密
- 证书是否可靠? 一句话,只要根证书可靠,整个证书链就可靠,而根证书是否可靠要看这个根证书是否在操作系统或浏览器内置的可信根证书内,在的话就可信。
- 客户端向服务端发送自己所能支持的对称加密方案,供服务器端进行选择
- 服务器端在客户端提供的加密方案中选择加密程度最高的加密方式。
- 服务器将选择好的加密方案通过明文方式返回给客户端
- 客户端接收到服务端返回的加密方式后,使用该加密方式生成产生随机码,用作通信过程中对称 加密的密钥,使用服务端返回的公钥进行加密,将加密后的随机码发送至服务器
- 服务器收到客户端返回的加密信息后,使用自己的私钥进行解密,获取对称加密密钥。
在接下来的会话中,服务器和客户端将会使用该密码进行对称加密,保证通信过程中信息的安全。
证书链实例:
双向认证
双向认证流程(双方都有证书):
-
客户端向服务端发送SSL协议版本号、加密算法种类、随机数等信息。
-
服务端给客户端返回SSL协议版本号、加密算法种类、随机数等信息,同时也返回服务器端的证书,即公钥证书
-
客户端使用服务端返回的信息验证服务器的合法性,包括:
* 证书是否过期
* 发型服务器证书的CA是否可靠
* 返回的公钥是否能正确解开返回证书中的数字签名
* 服务器证书上的域名是否和服务器的实际域名相匹配
验证通过后,将继续进行通信,否则,终止通信 -
服务端要求客户端发送客户端的证书,客户端会将自己的证书发送至服务端
-
验证客户端的证书,通过验证后,会获得客户端的公钥
-
客户端向服务端发送自己所能支持的对称加密方案,供服务器端进行选择
-
服务器端在客户端提供的加密方案中选择加密程度最高的加密方式
-
将加密方案通过使用之前获取到的公钥进行加密,返回给客户端
-
客户端收到服务端返回的加密方案密文后,使用自己的私钥进行解密,获取具体加密方式,而后,产生该加密方式的随机码,用作加密过程中的密钥,使用之前从服务端证书中获取到的公钥进行加密后,发送给服务端
-
服务端收到客户端发送的消息后,使用自己的私钥进行解密,获取对称加密的密钥,在接下来的会话中,服务器和客户端将会使用该密码进行对称加密,保证通信过程中信息的安全。
证书验证链: