文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。
协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。HTTP协议,即超文本传输协议是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。HTTP协议是用于从万维网服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。众所周知,HTTP是一个无状态的应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。在Internet中所有的传输都是通过TCP/IP进行的。HTTP协议作为TCP/IP模型中应用层的协议也不例外。HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。如下图所示:
而大家都很清楚TCP/IP共分为四层:应用层、传输层、网络层、数据链路层; 为什么TCP/IP要分成四层呢?意思何在呢?其实主要原因是由于分层能够解耦,动态替换层内协议,不同层各司其责: 应用层:向用户提供应用服务时的通讯活动(ftp,dns,http) 传输层:网络连接中两台计算机的数据传输(tcp、udp) 网络层:处理网络上流动的数据包,通过怎样的传输路径把数据包传送给对方(ip) 数据链路层:与硬件相关的网卡、设备驱动等等。
但是HTTP也有几个较为显著的缺点:
-
通信使用明文,内容容易被抓包泄露
-
不验证通信方的身份,因此有可能遭遇伪装
-
无法证明报文的完整性,所以有可能遭到篡改
正是由于这几个显著的缺点存在,所以HTTPS应运而生。https俗称超文本传输安全协议。是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。HTTPS是在HTTP的基础上加上一层安全层,用于数据加密、解密、身份认证,即
- HTTP + 加密 + 认证 = HTTPS
说到加密,开发人员基本都不会陌生。我们平常开发中接触形形色色的加密算法,简单来说分为对称加密算法与非对称加密算法以及散列算法。算法的区别在哪呢?我们可以这么来理解三种算法的区别:
- 对称加密算法:加密和解密数据使用同一个密钥。这种加密方式的特点是速度很快。
- 非对称加密算法:数据用公钥加密后必须用私钥解密,数据用私钥加密后必须用公钥解密。这种加密方式的特点是速度慢,CPU 开销大。
- 散列算法:没有秘钥,目前无法反向解密。(暴力破解除外)
我们为什么需要加密?我们日常生活中登录密码或者各种隐私信息都需要进行加密保存防止信息泄露。那我们接下来来看看这三种算法类型分别有什么样的算法呢:
- 对称加密算法:目前主流算法有DES算法,3DES算法,AES算法
- 非对称加密算法:目前主流算法有RSA算法
- 散列算法:目前主要以MD5和SHA-1算法为主
CA证书:CA证书CA证书内含服务端公钥与私钥,使用hash散列函数计算明文信息的信息摘要,然后采用CA证书内含的私钥对信息摘要进行加密最终生成签名。即:证书 = 公钥 + 签名 +申请者和颁发者的信息。客户端中因为在操作系统中就预置了CA的公钥,所以支持解密签名。
知道了上面这些基础知识,接下来我们一起了解HTTPS如何进行安全认证,首先主要有单向认证和双向认证两种认证方式:
单向认证
从上图可以看出,单向认证过程如下:
- 客户端向服务端发送SSL协议版本号、加密算法种类、随机数等信息。
- 服务端给客户端返回SSL协议版本号、加密算法种类、随机数等信息,同时也返回服务器端的证书,即公钥证书
- 客户端使用服务端返回的信息验证服务器的合法性,包括:
- 证书是否过期
- 发行服务器证书的CA是否可靠
- 返回的公钥是否能正确解开返回证书中的数字签名
- 服务器证书上的域名是否和服务器的实际域名相匹
- 验证通过后,将继续进行通信,否则,终止通信
- 客户端向服务端发送自己所能支持的对称加密方案,供服务器端进行选择
- 服务器端在客户端提供的加密方案中选择加密程度最高的加密方式。
- 服务器将选择好的加密方案通过明文方式返回给客户端
- 客户端接收到服务端返回的加密方式后,使用该加密方式生成产生随机码,用作通信过程中对称加密的密钥,使用服务端返回的公钥进行加密,将加密后的随机码发送至服务器
- 服务器收到客户端返回的加密信息后,使用自己的私钥进行解密,获取对称加密密钥。 在接下来的会话中,服务器和客户端将会使用该密码进行对称加密,保证通信过程中信息的安全。
HTTPS双向认证
单向认证客户端只需要认证服务端,而在双向认证中服务端同样需要对客户端进行认证: 双向认证具体过程如下:
- 客户端向服务端发送SSL协议版本号、加密算法种类、随机数等信息。
- 服务端给客户端返回SSL协议版本号、加密算法种类、随机数等信息,同时也返回服务器端的证书,即公钥证书
- 客户端使用服务端返回的信息验证服务器的合法性,包括:
- 证书是否过期
- 发行服务器证书的CA是否可靠
- 返回的公钥是否能正确解开返回证书中的数字签名
- 服务器证书上的域名是否和服务器的实际域名相匹配
- 验证通过后,将继续进行通信,否则,终止通信
- 服务端要求客户端发送客户端的证书,客户端会将自己的证书发送至服务端
- 验证客户端的证书,通过验证后,会获得客户端的公钥
- 客户端向服务端发送自己所能支持的对称加密方案,供服务器端进行选择
- 服务器端在客户端提供的加密方案中选择加密程度最高的加密方式
- 将加密方案通过使用之前获取到的公钥进行加密,返回给客户端
- 客户端收到服务端返回的加密方案密文后,使用自己的私钥进行解密,获取具体加密方式,而后,产生该加密方式的随机码,用作加密过程中的密钥,使用之前从服务端证书中获取到的公钥进行加密后,发送给服务端
- 服务端收到客户端发送的消息后,使用自己的私钥进行解密,获取对称加密的密钥,在接下来的会话中,服务器和客户端将会使用该密码进行对称加密,保证通信过程中信息的安全。
但是HTTPS即使号称超文本传输安全协议,也是很容易被抓包的,一般可以通过Charles、fildder等工具作为中间层,进行身份的伪装:对客户端伪装成服务端,对服务端伪装成客户端: 截获客户端的HTTPS请求,伪装成客户端去向服务端发送HTTPS请求 接受服务端返回,用自己的证书伪装成服务端向客户端发送数据内容。
具体过程如下图所示:
反抓包策略 那我们应该如何防止被抓包呢?可以使用SSL-Pinning技术来反抓包。因为被抓包主要是由于伪造了一个假的服务端证书给了客户端,音粗可以同时在客户端也保存一份服务端的证书,就可以知道数据来源的证书是不是真实服务端来源了。SSL-pinning有两种方式: 证书锁定(Certificate Pinning) 公钥锁定(Public Key Pinning)
证书锁定
证书锁定是SSL/TLS加密的额外保证手段。它会将服务器的证书公钥预先保存在客户端。在建立安全连接的过程中,客户端会将预置的公钥和接受的证书做比较。如果一致,就建立连接,否则就拒绝连接。在客户端设置证书只允许设置指定域名的证书,而不接受操作系统或浏览器内置的CA根证书对应的任何证书。
**公钥锁定 **
HTTP公钥锁定是HTTPS网站防止攻击者CA机构错误签发的证书进行中间人攻击的一种安全机制,用于预防CA遭受入侵或其他会造成CA签发未授权证书的情况。采用公钥锁定时,网站会提供已授权公钥的哈希列表,指示客户端在后续通讯中只接受列表上的公钥。提取证书中的公钥并内置到客户端中,通过与服务器对比公钥值来验证连接的正确性。
HTTPS和HTTP的区别
https协议需要到ca申请证书,一般免费证书很少,需要交费。 http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。 http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。 http的连接很简单,是无状态的。 HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
HTTPS解决的问题
防止第三方冒充服务器。 防止第三方拦截通信报文,窃取通信中请求报文、响应报文的内容。 防止第三方拦截通信报文,篡改报文内容。
欢迎关注我个人公众号:程序猿周先森
本文由博客一文多发平台 OpenWrite 发布!