网络通信和IO(8):HTTPS原理及面试题,中间人攻击 /HTTPS和HTTP的区别 /HTTPS的实现原理 /面试题:用了HTTPS就一定安全了吗?/怎么防止中间人攻击

密码学基础概念

公钥和私钥:公钥和私钥是通过一种算法得到的密钥对,公钥是密钥对中公开的部分,私钥是密钥对中非公开的部分,公钥通常用于加密会话密钥,验证数字签名,或加密相应的私钥解密的数据。密钥能保证世界范围内独一,使用这个密钥对时,如果用其中一个加密一段数据,只能用另一个密钥解开。

对称加密:采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法成为对称加密,也称为单密钥加密。

非对称加密:非对称加密需要公钥和私钥配合使用,如果用公钥加密,只能用私钥才能解开,正是因为加密和解密是用不同的密钥,所以这种算法叫做非对称加密。

非对称加密它的思想很简单,计算两个质数的乘积很容易,但反过来分解成两个质数的乘积就很难,要经过极为复杂的运算。非对称加密有两个秘钥,一个是公钥,一个是私钥。公钥加密的内容只有私钥可以解密,私钥加密的内容只有公钥可以解密。一般我们把服务器自己留着,不对外公布的密钥称为私钥,所有人都可以获取的称为公钥。

HTTPS和HTTP的区别

HTTP协议是以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,为了解决数据传输的安全问题因此出现了https,https是在http的基础上加入SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

因此HTTPS的主要作用有两种:建立一个信息安全通道,来保证数据传输的安全,另一个就是确认网站的真实性。它和HTTP的主要区别:

  • https协议需要ca申请证书,一般免费的证书较少,因而需要一定的费用

  • http是超文本传输协议,信息是明文传输,https则是具有ssl加密传输协议

  • http和https使用的是完全不同的连接方式,用的端口也不一样,http是80,https是443

  • http的连接简单,是无状态的,https协议是由ssl+http协议构建的可进行加密传输、身份认证等。

HTTPS的实现原理

网络通信和IO(8):HTTPS原理及面试题,中间人攻击 /HTTPS和HTTP的区别 /HTTPS的实现原理 /面试题:用了HTTPS就一定安全了吗?/怎么防止中间人攻击_第1张图片

证书验证阶段

1.浏览器发起HTTPS请求(浏览器会内置第三方CA的公钥)

2.服务端收到HTTPS请求,使用第三方CA的私钥加密公钥、以及机构信息、域名等,然后返回CA证书

3.客户端(浏览器)持有CA的公钥,可以对证书内容解密,然后通过证书中的域名、机构等信息验证证书是否合法,如果不合法则提示告警

数据传输阶段

1.证书验证合法后,在本地生成随机数

2.通过公钥加密随机数,并把加密后的随机数传输到服务端

3.服务端通过私钥对随机数进行解密

4.服务端通过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后传输

为什么数据传输使用对称协议呢而不直接用非对称加密呢?

因为非对称加密的加解密效率非常底,为了节省双方的计算时间,非对称加密通常只用来交换密钥。

另外在https的场景中只有服务端保存了私钥,一对公私钥只能实现单项的加解密,所以https中内容传输加密采用的是对称加密而不是非对称加密。

用了HTTPS就一定安全了吗?

使用https可以认证用户和服务器,确保数据以加密的形式发送到正确的客户机和服务器,但并不意味着一定安全,比如客户端生成的随机数被窃取或者dns劫持访问到钓鱼网站、中间人攻击等等。

网络通信和IO(8):HTTPS原理及面试题,中间人攻击 /HTTPS和HTTP的区别 /HTTPS的实现原理 /面试题:用了HTTPS就一定安全了吗?/怎么防止中间人攻击_第2张图片

“中间人攻击”过程原理

1.本地请求被劫持(如DNS劫持等),所有请求均发送到中间人的服务器

2.中间人服务器返回中间人自己的证书

3.客户端创建随机数,通过中间人证书的公钥对随机数加密后传送给中间人,然后凭随机数构造对称加密对传输内容进行加密传输

4.中间人因为拥有客户端随机数,可以通过对称加密算法进行内容解密

5.中间人以客户端的请求内容再向正规网站发起请求

6.因为中间人与服务器的通信过程是合法的,正规网站通过建立的安全通道返回加密后的数据

7.中间人凭借与正规网站建立的对称加密算法对内容进行解密

8.中间人通过与客户端建立的对称加密算法对正规内容返回的数据进行加密传输

9.客户端能通过与中间人建立的对称加密算法对返回结果数据进行解密

由于缺少对证书的验证,所以客户端虽然发起的是HTTPS请求,单客户端完全不知道自己的网络已经被拦截,传输内容被中间人全部窃取。

怎么防止中间人攻击

浏览器如何验证证书的合法性

浏览器发起HTTPS请求时,服务器会返回网站的SSL证书,浏览器需要对证书做一下验证:

  • 验证域名、有效期等信息是否正确,证书上都有包含这些信息,比较容易完成验证

  • 判断证书来源是否合法,每份签发证书都可以根据验证链查找到对应的根证书,操作系统、浏览器会在本地存储权威机构的根证书,利用本地根证书可以对对应机构签发证书完成来源验证

  • 判断证书是否被篡改,需要与CA服务器进行效验

  • 通过CRL和OCSP可以判断证书是否已吊销,其中OCSP可用于第三步中以减少与CA服务器的交互,提高验证效率

以上任意情况都满足的情况下浏览器才认为证书合法的

总结以及补充一些问题(面试题)

什么是 HTTPS?

HTTP协议是以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,为了解决数据传输的安全问题因此出现了https

https是在http的基础上加入SSL协议,SSL是位于 HTTP 协议与 TCP/IP 协议中间的协议,它依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

因此HTTPS的主要作用有两种:建立一个信息安全通道,来保证数据传输的安全,另一个就是确认网站的真实性。

HTTPS怎么加密传输的?

首先服务端收到HTTPS的请求回返回给客户端一个证书,证书中包含公钥等其他认证信息,客户端认证证书合法以后创建一个随机数,再通过公钥加密随机数发送给服务端,服务端再通过私钥解密随机数,然后把请求的数据用随机数对称加密返回客户端,客户端用随机数解密,也就说数据是对称加密传输的,而用于对称加密的随机数是非对称加密的。因为使用对称加密一般要比非对称加密快得多,对服务器的运算压力也小得多。所以数据就用对称加密了。

现在 HTTPS 协议的握手阶段变成了四步:

1.客户端:发起一个 HTTPS 请求,请给我公钥

2.服务器:这是我的证书,里面有加密后的公钥

3.客户端:解密成功以后给服务器用公钥非对称加密后的随机数

4.服务器:服务器返回确认收到随机数,以后就用它对称加密数据

这里还有个细节就是第2步和第3步,服务器返回证书中的公钥是加密后的,那么这个公钥怎么解密,答案肯定是用颁发证书的厂商的公钥来解密这个公钥。

这个公钥不用传输,会直接内置在各大操作系统或者浏览器的出厂设置里。之所以不把每个服务器的公钥内置在电脑里,一方面是因为服务器太多,存不过来。另一方面操作系统也不信任你,凭什么你说你这个就是百度/淘宝的证书呢?所以各个公司要先去权威机构认证,申请证书,然后操作系统只会存储权威机构的公钥。因为权威机构数量有限,所以操作系统厂商相对来说容易管理。如果这个权威机构不够权威,XJB 发证书,就会取消他的资格,比如可怜的沃通。。。。

如何验证证书的合法性

浏览器发起HTTPS请求时,服务器会返回网站的SSL证书,浏览器需要对证书做一下验证:

验证域名、有效期等信息是否正确,证书上都有包含这些信息,比较容易完成验证

判断证书来源是否合法,每份签发证书都可以根据验证链查找到对应的根证书,操作系统、浏览器会在本地存储权威机构的根证书,利用本地根证书可以对对应机构签发证书完成来源验证

判断证书是否被篡改,需要与CA服务器进行效验

通过CRL和OCSP可以判断证书是否已吊销,其中OCSP可用于第三步中以减少与CA服务器的交互,提高验证效率

怎么知道证书有没有被篡改?

服务器第一次会返回证书,也就是加密以后的公钥,那我怎么知道这个证书是可靠的呢?

为了确保原始证书没有被篡改,我们可以在传递证书的同时传递证书的哈希值。就算篡改,但是因为没有私钥, 所以无法正确的加密。所以它再返回给客户端的数据是无效数据,用公钥解析后会得到乱码。即使攻击者通过多次尝试碰巧能够解析,也无法通过哈希校验。

这样可以防止第三方冒充服务器么(中间人攻击)

首先真正的服务器下发的内容,无法被别人篡改。他们有权威机构的公钥,可以解密,但是因为没有私钥,所以解密以后的信息无法加密。没有加密或者错误加密的信息被客户端用公钥解密以后,必然无法通过哈希校验。

但是,如果你一开始请求的就不是真的服务器,而是一个攻击者,此时的他完全有机会进行中间人攻击。第一次握手的时候服务器会下发用于证明自己身份的证书,这个证书会用预设在设备上的公钥来解密。所以要么是经过认证的证书用权威机构的私钥加密,再用权威机构解密,要么是用非权威机构的私钥加密,然后找不到公钥解密。

所以如果不小心安装过非权威机构的根证书,比如黑客提供的恶意证书,这时候设备上就多了一个预设的公钥,那么用恶意私钥加密的证书就能被正常解析出来。所以千万不要随便装根证书,这等于是为那些恶意证书留了一扇门。

当然,凡是都有两面性。我们知道 Charles 可以调试 HTTPS 通信,它的原理就是需要用户安装 Charles 的根证书,然后我们的请求会被代理到 Charles 服务器,它下发的 Charles 证书才能被正确解析。另一方面,Charles 会作为客户端,从真正的服务器哪里拿到正确的 https 证书并用于后续通信。幸好 Charles 不是流氓软件,或者它的私钥一旦泄露,对用户都会造成很大的影响。点击查看图解https的认证过程详情。

我可以举一个例子,证书有多个种类,最贵的叫 EV (Extended Validation),它需要公司营业执照等多个文件才能申请人工审核,好处也很明显,可以在浏览器地址栏左侧准确显示公司名称,比如 Bitbucket 的官网:

在这里插入图片描述

HTTPS 握手会影响性能么

TCP 有三次握手,再加上 HTTPS 的四次握手,会不会影响性能?

影响肯定有,但是可以接受,首先,HTTPS 肯定会更慢一点,时间主要花费在两组 SSL 之间的耗时和证书的读取验证上,对称算法的加解密时间几乎可以忽略不计。而且如果不是首次握手,后续的请求并不需要完整的握手过程。客户端可以把上次的加密情况直接发送给服务器从而快速恢复。

除此以外,SSL 握手的时间并不是只能用来传递加密信息,还可以承担起客户端和服务器沟通 HTTP2 兼容情况的任务。因此从 HTTPS 切换到 HTTP2.0 不会有任何性能上的开销,反倒是得益于 HTTP2.0 的多路复用等技术,后续可以节约大量时间。

如果把 HTTPS2.0 当做目标,那么 HTTPS 的性能损耗就更小了,远远比不上它带来的安全性提升。

冒用证书问题

证书是公开的,所以中间人想发起攻击,可以在官网下载一份证书作为我的服务器证书,那客户端肯定认同这个证书是合法的,如果避免这种证书冒用的情况?

其实着就是非对称加密的作用,虽然中间人可以得到证书,但是私钥无法获取,中间人即使拿到证书,也无法伪装成合法服务端,因为无法对客户端传入的加密数据进行解密。

只有认证机构可以生成证书吗?

如果需要浏览器不提示安全风险,那只能使用认证机构签发的证书,但浏览器通常只是提示安全风险,并不限制网站不能访问,所以从技术上谁都可以生成证书,只要有证书就可以完成网站的HTTPS传输,例如早期的12306采用的就是手动安装私有证书的形式实现HTTPS访问

本地随机数被窃取了怎么办?

证书验证是采用非对称加密实现的,但是传输过程是采用对称加密,而其中对称加密算法中重要的随机数是由本地生产并且存储于本地的,HTTPS如何保证随机数不会被窃取呢?

其实HTTPS并不包含对随机数的安全保证,HTTPS保证的只是传输过程安全,而随机数存储于本地,本地的安全属于另一安全范畴,应对的措施有安装杀毒软件、反木马、浏览器升级修复漏洞等。

用了HTTPS会被抓包吗?

HTTPS的数据是加密的,常规下抓包工具代理请求后抓到的包内容是加密状态,无法直接查看,如果用户授权仍任可以继续访问网站,完成请求,因此只要客户端是我们自己的终端,我们授权的情况下,便可以组件中间人网络,而抓包工具便是作为中间人的代理,通常HTTPS抓包工具的使用方法是会生成一个证书,用户需要把证书安装到客户端,然后终端发起的所有请求通过该证书完成于抓包工具的交互,然后抓包工具再转发请求到服务器,最后把服务器返回的结果在控制台输出后再返回给终端,从而完成整个请求的闭环。

参考文章:https://mp.weixin.qq.com/s/1NEnOdoeIelBtdpRztDoEg

网络通信和IO(8):HTTPS原理及面试题,中间人攻击 /HTTPS和HTTP的区别 /HTTPS的实现原理 /面试题:用了HTTPS就一定安全了吗?/怎么防止中间人攻击_第3张图片

公众号内有完整网络与IO系列文章,回复关键字“资源”,可以免费领取架构师、大数据、AI等课程以及大厂面试视频讲解

你可能感兴趣的:(IO与网络通信)