近年来,随着用户和互联网企业安全意识的提高和HTTPS成本的下降,HTTPS已经越来越普及。HTTPS(全称是HypertextTransferProtocolSecure,即安全超文本传输协议)是一种安全的网络传输协议,它在传统的HTTP协议上加入了SSL/TLS加密层,用于保护网络通信过程中的数据安全,防止数据被篡改或窃取。
HTTPS并没有一个确切的发明年份,因为它是在HTTP协议的基础上逐渐发展演变而来的。HTTP协议是在1989年由蒂姆·伯纳斯-李(TimBerners-Lee)发明的,而HTTPS的安全特性是通过在HTTP协议上添加SSL(SecureSocketsLayer)或TLS(TransportLayerSecurity)协议来实现的。
SSL协议最早是由Netscape公司在1994年引入,目的是为了提供安全的网络通信。随后,SSL协议经过多年的发展和标准化,逐渐演变成了现在的TLS协议。TLS协议是SSL协议的后续版本,它在安全性和兼容性方面进行了改进。
HTTP之所以被HTTPS取代,最大的原因就是不安全,如下图所示:
从图中我们可以看出,在HTTP数据传输过程中,所有的信息都是以明文形式进行的,这无疑让安全性大打折扣,特别是对于一些敏感信息,例如用户密码和信用卡信息等,一旦被不法分子截获,后果将不堪设想。
或许有人会提议,我们可以在前端页面对接收到的敏感数据进行加密处理,比如使用MD5加盐加密。但这种想法显然过于天真。首先,MD5并非一种加密算法,其英文全称是MessageDigestAlgorithmMD5,意为消息摘要算法,它是一种无法逆转的散列算法,这意味着经过前端MD5处理后的数据在服务器端是无法恢复的。
HTTPS解决数据传输安全问题的方案就是使用加密算法,具体来说是混合加密算法,也就是对称加密和非对称加密的混合使用,这里有必要先了解一下这两种加密算法的区别和优缺点。
对称加密,顾名思义就是加密和解密都是使用同一个密钥,常见的对称加密算法有DES、3DES和AES等,其优缺点如下:
本文不对具体的加密算法做详细介绍,有兴趣的同学可以参考对称加密算法详解,如果直接将对称加密算法用在HTTP中,会是下面的效果:
从图中可以看出,被加密的数据在传输过程中是无规则的乱码,即便被第三方截获,在没有密钥的情况下也无法解密数据,也就保证了数据的安全。但是有一个致命的问题,那就是既然双方要使用相同的密钥,那就必然要在传输数据之前先由一方把密钥传给另一方,那么在此过程中密钥就很有可能被截获,这样一来加密的数据也会被轻松解密。那如何确保密钥在传输过程中的安全呢?这就要用到非对称加密了。
非对称加密,就是加密和解密需要使用两个不同的密钥:公钥(publickey)和私钥(privatekey)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公钥对外公开;得到该公钥的乙方使用公钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的私钥对加密后的信息进行解密。如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。常用的非对称加密算法是RSA算法,其优缺点如下:
由于非对称加密的强安全性,可以用它完美解决对称加密的密钥泄露问题,效果图如下:
在上述过程中,客户端在拿到服务器的公钥后,会生成一个随机码(用KEY表示,这个KEY就是后续双方用于对称加密的密钥),然后客户端使用公钥把KEY加密后再发送给服务器,服务器使用私钥将其解密,这样双方就有了同一个密钥KEY,然后双方再使用KEY进行对称加密交互数据。在非对称加密传输KEY的过程中,即便第三方获取了公钥和加密后的KEY,在没有私钥的情况下也无法破解KEY(私钥存在服务器,泄露风险极小),也就保证了接下来对称加密的数据安全。而上面这个流程图正是HTTPS的雏形,HTTPS正好综合了这两种加密算法的优点,不仅保证了通信安全,还保证了数据传输效率。
HTTPS(HypertextTransferProtocolSecure)是基于HTTP的扩展,用于计算机网络的安全通信,已经在互联网得到广泛应用。在HTTPS中,原有的HTTP协议会得到TLS(安全传输层协议)或其前辈SSL(安全套接层)的加密。因此HTTPS也常指HTTPoverTLS或HTTPoverSSL。
可见HTTPS并非独立的通信协议,而是对HTTP的扩展,保证了通信安全,二者关系如下:
也就是说HTTPS=HTTP+SSL/TLS。
HTTPS的整个通信过程可以分为两大阶段:证书验证和数据传输阶段,数据传输阶段又可以分为非对称加密和对称加密两个阶段。具体流程按图中的序号讲解。
SSL和TLS协议可以为通信双方提供识别和认证通道,从而保证通信的机密性和数据完整性。TLS协议是从NetscapeSSL3.0协议演变而来的,不过这两种协议并不兼容,SSL已经逐渐被TLS取代,所以下文就以TLS指代安全层。TLS握手是启动HTTPS通信的过程,类似于TCP建立连接时的三次握手。在TLS握手的过程中,通信双方交换消息以相互验证,相互确认,并确立它们所要使用的加密算法以及会话密钥(用于对称加密的密钥)。可以说,TLS握手是HTTPS通信的基础部分。
我们已经知道TLS握手的目的是建立安全连接,那么通信双方在这个过程中究竟干了什么呢?下面就是答案:
SSL/TLS握手详细过程
1、HTTP与HTTPS有什么联系?它们的端口号是多少?
HTTP通常承载于TCP之上,在HTTP和TCP之间添加一个安全协议层(SSL或TSL),这个时候,就成了我们常说的HTTPS。HTTP默认的端口号为80,Https默认的端口号为443。
2、为什么HTTPS更安全?
在网络请求中,需要有很多服务器、路由器的转发。其中的节点都可能篡改信息,而如果使用HTTPS,密钥在终点站才有。HTTPS之所以比HTTP安全,是因为它利用SSL/TLS协议传输。它包含证书、卸载、流量转发、负载均衡、页面适配、浏览器适配、refer传递等技术,保障了传输过程的安全性。
3、关于HTTP/2你知道多少?
HTTP/2引入了“服务器端推送”(serverpush)的概念,它允许服务器端在客户端需要数据之前主动将数据发送到客户端缓存中,从而提高性能。
HTTP/2提供更多的加密支持。
HTTP2使用多路技术,允许多个消息在一个连接上同时交差。
它增加了头压缩(headercompression),因此请求非常小,请求和响应的header都只会占用很小的带宽比例。
4、说出你知道的HTTP常见状态码。
(1)100Continue表示继续,一般在发送post请求时,已发送了HTTPheader之后,服务器端将返回此信息,表示确认,之后发送具体参数信息。
(2)200OK表示正常返回信息
(3)201Created表示请求成功并且服务器创建了新的资源。
(4)202Accepted表示服务器已接受请求,但尚未处理。
(5)301MovedPermanently表示请求的网页已永久移动到新位置。
(6)302Found表示临时性重定向。
(7)303SeeOther表示临时性重定向,且总是使用GET请求新的URI。
(8)304NotModified表示自从上次请求后,请求的网页未修改过,
(9)400BadRequest表示服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。
(11)403Forbidden表示禁止访问。
(12)404NotFound表示找不到如何与URI相匹配的资源。
(13)500InternalServererror表示最常见的服务器端错误。
(14)503ServiceUnavailable表示服务器端暂时无法处理请求(可能是过载或维护)。
5、完整的HTTP事务流程是怎样的?
基本流程如下。
(1)域名解析。
(2)发起TCP的3次握手。
(3)建立TCP连接后发起HTTP请求。
(4)服务器端响应HTTP请求,浏览器得到HTML代码。
(5)浏览器解析HTML代码,并请求HTML代码中的资源。
(6)浏览器对页面进行渲染并呈现给用户。
6、实现一个简单的HTTP服务器。
在Node.js中加载HTTP模块,并创建服务器,监听端口代码。如下所示:
7、什么是HTTP?
HTTP是客户端和服务器端之间数据传输的格式规范,表示“超文本传输协议”。
8、什么是HTTP无状态协议?如何克服HTTP无状态协议的缺陷?
(1)无状态协议对于事务处理没有记忆能力。缺少状态意味着如果后续需要处理,需要前面提供的信息。
(2)克服无状态协议缺陷的办法是通过cookie和会话保存信息。
9、HTTP的请求报文和响应报文包含哪些部分?
请求报文包含3部分。
(1)请求行,包含请求方法、URI、HTTP版本信息。
(2)请求首部字段。
(3)请求内容实体。
响应报文包含3部分。
(1)状态行,包含HTTP版本、状态码、状态码的原因短语。
(2)响应首部字段。
(3)响应内容实体。
10、HTTP中有哪些请求方式?
(1)GET:请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL,给服务器传递参数数据
(2)POST:传输信息给服务器,主要功能与GET方法类似,但传递的数据量通常不受限制。
(3)PUT:传输文件,报文主体中包含文件内容,保存到对应URI位置。
(4)HEAD:获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。
(5)DELETE:删除文件,与PUT方法相反,删除对应URL位置的文件。
(6)OPTIONS:查询相应URI支持的HTTP方法。
11、HTTP协议中1.0版本规范与1.1版本规范的区别是什么?
在HTTP1.0中,当建立连接后,客户端发送一个请求,服务器端返回一个信息后就关闭连接,当浏览器下次请求的时候又要建立连接。显然,这种不断建立连接的方式会造成很多问题。
在HTTP1.1中,引入了持续连接的概念。通过这种连接,浏览器可以在建立一个连接之后,发送请求并得到返回信息,然后继续发送请求再次等到返回信息。也就是说,客户端可以连续发送多个请求,而不用等待每一个响应的到来。
12、HTTP的首部字段包括哪些类型?
(1)通用首部字段(请求报文与响应报文都会使用的首部字段)。
它包括以下几部分。
(2)请求首部字段(请求报文会使用的首部字段)。
(3)响应首部字段(响应报文会使用的首部字段)。
它包括以下几部分
Server:HTTP服务器的安装信息
(4)实体首部字段(请求报文与响应报文的实体部分使用的首部字段)。
13、与HTTPS相比,HTTP有什么缺点?
HTTP的缺点如下。
(1)通信使用明文,不加密,内容可能被窃听,也就是被抓包分析。
(2)不验证通信方身份,可能遭到伪装。
(3)无法验证报文完整性,可能被篡改。
HTTPS就是HTTP+加密处理(一般是SSL安全通信线路)+认证+完整性保护。
14、如何优化HTTP请求?
利用负载均衡优化和加速HTTP应用请求;利用HTTP缓存来优化网站请求。
15、HTTP协议有哪些特征?
支持客户端/服务器模式,简单快速,灵活,无连接,无状态。
16、HTTP1.1版本的新特性有哪些?
新特性如下所示。
(1)默认持久连接,节省通信量,只要客户端服务端中任意一端没有明确指出断开TCP连接,就一直保持连接,可以多次发送HTTP请求。
(2)管线化,客户端可以同时发出多个HTTP请求,而不用一个个等待响应。
(3)断点续传原理。
17、说说TCP传输的三次握手、四次挥手策略。
为了准确无误地把数据送达目标处,TCP采用了三次握手策略。用TCP把数据包发送出去后,TCP不会对传送后的数据置之不理,它一定会向对方确认是否成功送达。握手过程中使用了TCP的标志,即SYN和ACK。
发送端首先给接收端发送一个带SYN标志的数据包。接收端收到后,回传一个带有SYN/ACK标志的数据包以表示正确传达,并确认信息。最后,发送端再回传一个带ACK标志的数据包,代表“握手”结東。若在握手过程中的某个阶段莫名中断,TCP会再次以相同的顺序发送相同的数据包。
断开一个TCP连接则需要“四次握手”。
第一次握手:主动关闭方发送一个FIN,用来关闭主动关闭方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方,主动关闭方已经不会再给被动关闭方发送数据了(当然,在FIN包之前发送出去的数据,如果没有收到对应的ACK确认报文主动关闭方依然会重发这些数据),但是,此时主动关闭方还可以接收数据。
第二次握手:被动关闭方收到FIN包后,给对方发送一个ACK,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
第三次握手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,被动关闭方的数据也发送完了,不会再给主动关闭方发送数据了。
第四次握手:主动关闭方收到FIN后,给被动关闭方发送一个ACK,确认序号为收到序号+1,至此,完成四次握手。
18、说说TCP和UDP的区别。
TCP(Transmissioncontrolprotocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过3次“对话”才能建立起来。
UDP(UserDatagramProtocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去。UDP适用于次只传送少量数据、对可靠性要求不高的应用环境。
19、一个页面从输入URL到页面加载显示完成,这个过程中都发生了什么?
整个过程可分为4个步骤。
(1)当发送一个URL请求时,不管这个URL是Web页面的URL还是Web页面上毎个资源的URL,浏览器都会开启一个线程来处理这个请求,同时在远程DNS服务器上启动一个DNS查询。这能使浏览器获得请求对应的IP地址。
(2)浏览器与远程Web服务器通过TCP三次握手协商来建立一个TCPP连接。该握手包括一个同步报文、一个同步-应答报文和一个应答报文,这3个报文在浏览器和服务器之间传递。该握手首先由客户端尝试建立起通信,然后服务器应答并接受客户端的请求,最后由客户端发出已经接受该请求的报文。
(3)一旦TCP/IP连接建立,浏览器会通过该连接向远程服务器发送HTTP的GET请求。远程服务器找到资源并使用HTTP响应返回该资源,值为200的HTTP响应状态码表示一个正确的响应
(4)此时web服务器提供资源服务,客户端开始下载资源。请求返回后,便进入了浏览器端模块。浏览器会解析HTML生成DOMTree,其次会根据CSS生成CSS规则树,而JavaScript又可以根据DOMAPI操作DOM。
20、网络分层模型有哪七层?
七层分别是应用(Application)层、表示(Presentation)层、会话(Session)层传输(Transport)层、网络(Network)层、数据链路(Link)层和物理(Physical)层。
每一层的作用如下。
21、网络七层模型中,你所熟知的协议有哪些?
有以下几种协议。
22、讲讲304缓存的原理。
服务器首先为请求生成ETag,服务器可在稍后的请求中,使用它来判断页面是否已经修改。本质上,客户端通过将该记号传回服务器要求服务器验证其(客户端)是否缓存。
304是HTTP状态码,服务器用它来标识这个文件没有修改,不返回内容,浏览器在接收到个状态码后,会使用浏览器已缓存的文件。
客户端请求页面A。服务器返回页面A,并给A加上一个ETag。客户端展现该页面,并将页面连同ETag一起缓存。
客户端再次请求页面A,并将上次请求时服务器返回的ETag起传递给服务器。
服务器检查该ETag,并判断岀该页面自上次客户端请求之后还未被修改,直接返回响应304(未修改一Notmodified)和一个空的响应体。
23、什么是Etag?
此时,我们在浏览器控制台中可以看到200OK(fromcache),这种情况就是完全使用缓存,浏览器和服务器没有任何交互。
若两种判断的结论都是文件没有被修改过,服务器就不给浏览器发送新的内容,而是直接告诉浏览器,文件没有被修改过,可以继续使用缓存—-304NotModified。
此时,浏览器就会从本地缓存中获取请求资源的内容,这种情况叫协议缓存,浏览器和服务器之间有一次请求交互。
24、说说ETag的应用。
Etag由服务器端生成,客户端通过If-Match或者If-None-Match这个条件判断请求来验证资源是否修改。常见的是使用I-None-Match。请求一个文件的流程如下。
第一次请求时,客户端发起HttpGet请求,以获取一个文件,服务器处理请求,返回文件内容和请求头(包括Eag),并返回状态码200第二次请求时,客户端发起HttpGet请求,以获取一个文件。
注意,这个时候客户端同时发送一个If-None-Match头,这个头的内容就是第一次请求时服务器返回的Etag服务器判断发送过来的Etag和计算出来的Etag是否匹配。
如果If-None-Match为False,不返回200,返回304,客户端继续使用本地缓存。