通过阅读《计算机网络–自顶向下方法》,以及结合最近面试的一些经历,作此笔记进行梳理和总结,也为日后的回顾作基底。
1)HTTPS基本概述
1.1 什么是HTTPS?
HTTPS(Hyper Text Transfer Protocol over SecureSocket Layer)是最常见的 HTTP 安全版本。
- HTTPS 将 HTTP 协议与一组强大的对称、非对称和基于证书的加密技术结合在一起,使得HTTPS不仅很安全,而且很灵活。
- 使用HTTPS时,所有的HTTP请求和响应数据在发送到网络之前,都要进行加密。
- HTTPS在HTTP下面提供了一个传输级的密码安全层(可以使用SSL或者TLS):
- HTTPS是位于安全层之上的HTTP,这个安全层位于TCP之上。
1.2 为什么需要HTTPS?
人们会用Web事务来处理一些重要的事情,如果没有强有力的安全保证,人们就无法安心地进行网络购物或者使用银行业务。因此Web需要一种安全的HTTP形式。
- 一些提供认证(基本认证和摘要认证)和报文完整性检查的轻量级方法对于大规模的购物、银行事务,或者对访问机密数据来说,不够强大。
对于大规模的购物、银行事务等重要的事务,需要将HTTP和数字加密技术结合起来使用,才能确保安全。
我们需要一种能够提供下列功能的HTTP安全技术:
- 服务器认证:客户端知道它们是在和真正的而不是伪造的服务器通话。
- 客户端认证:服务器知道它们是在和真正的而不是伪造的客户端通话。
- 完整性:客户端和服务器的数据不会被修改。
- 加密:客户端和服务器的对话是私密的,无需担心被窃听。
- 效率:一个运行得足够快的算法,以便低端的客户端和服务器使用。
- 普适性:基本上所有的客户端和服务器都支持这些协议。
- 管理的可扩展性:在任何地方的任何人都可以立即进行安全通信。
- 适应性:能够支持当前最知名的安全方法。
2)面试常问之HTTPS是如何实现的?
2.1 如何告知Web服务器执行HTTPS?
安全HTTP是可选的,所以对Web服务器发起请求时,需要以一种方式告知Web服务器去执行HTTP的安全协议版本,这是通过URL实现的。
- 通常,非安全HTTP的URL方案前缀是http,例如:
http://www.abc.com/index.html - 在安全HTTPS协议中,URL的方案前缀是https,例如:
https://efg.com/aaa?bbb=ccc
请求一个客户端(如Web浏览器)对某Web资源执行某事务时,它会去检查URL的方案:
- 如果URL方案是http,客户端就会打开一条到服务器端口80(默认情况下)的TCP连接,并向其发送HTTP命令。
- 如果URL方案是https,客户端则会打开一条到服务器端口443(默认情况下)的连接,并与服务器“握手”(客户端和服务器初始化SSL层,对加密参数进行沟通并交换密码),然后客户端将请求报文发送给安全层(因为这些报文发送给TCP前需要进行加密)。
2.2 建立安全传输的过程:
在发送加密的HTTP报文之前,客户端和服务器要进行一次SSL握手。
*什么是SSL?
安全套接字层(Secure Socket Layer, SSL) 通过采用机密性(加密)、数据完整性、服务器鉴别和客户鉴别来强化TCP,可以解决一些安全问题:
-
如果没有使用机密性(加密),一个入侵者可能截取客户的订单并得到其支付卡信息,就可以用该用户的卡来购买商品。 -
如果没有使用完整性,入侵者可能修改客户的订单,让其购买比更多数量的商品。 -
如果没有服务器鉴别,黑客可以假冒公司,截取客户的订单,然后拿了客户的钱一走了之,或者可能收集客户的名字、地址和信用卡号等隐私。
SSL提供了一个简单的具有套接字的应用编程接口(API),该接口类似于TCP的API,它包括了 SSL类/库。
-
如图8-24中所示,尽管SSL技术上位于应用层中,但从研发者的角度看,它是一个提供TCP服务的运输协议,而这里的TCP服务用安全性服务加强了。 -
SSL版本3的一个稍加修改的版本被称为运输层安全性(Transport Layer Security,TLS),已经由IETF标准化[RFC 4346 ]。 -
OpenSSL是SSL和TLS最常见的开源实现,可实现SSL和TSL协议以及一个全功能的通用加密库。
-
SSL握手: 在握手过程中,客户端和服务器要完成以下工作:
- 交换协议版本号
- 选择一个两端都了解的密码
- 对两端的身份进行认证
- 生成临时的会话密钥,以便加密信道
简化版的SSL握手过程:
- 一旦建立了TCP连接,客户端就向服务器发送一个SSL hello报文(里面有该客户所支持的密码算法列表,以及一个客户的不重数)。
- 服务器从该列表中选择一种对称算法(例如AES)、一种公钥算法(例如具有特定密钥长度的RSA)和一种MAC算法,并将它的选择以及证书,和一个服务器不重数返回给客户端。
- 客户端验证该证书,并提取服务器的公钥,然后产生一个主密钥(MS,Master Secret,仅用于这个SSL会话),用提取的公钥加密该MS以生成加密的主密钥(EMS),并将该EMS发给服务器。
- 服务器用私钥解密该EMS从而得到该MS,此时客户端和服务器(而无其他人)均知道了用于这次SSL会话的主密钥,自此以后,客户和服务器之间发送的所有报文均被加密和鉴别。
- 客户端发送所有握手报文的一个MAC。
- 服务器发送所有握手报文的一个MAC。
*什么是服务器证书?
服务器证书是一个显示了组织的名称、地址、服务器DNS域名以及其他信息的X.509 v3格式(大部分使用该标准格式)的证书。
*如何验证证书的有效性?
大部分浏览器都会对证书进行简单的完整性检查,网景公司提出了一种Web服务器证书有效性算法:
- 日期检测:检查证书的起始和结束日期,以确保证书仍然有效。
- 签名颁发者可信度检测:每个证书都是由某些证书颁发机构(CA)签发的,它们为服务器做担保,浏览器会附带一个签名颁发机构的受信列表。
- 签名检测:一旦判定签名授权是可信的,浏览器就要对签名使用签名颁发机构的公开密钥,并将其与校验码进行比较,以查看证书的完整性。
- 站点身份检测:为了防止服务器复制其他人的证书或者拦截其他人的流量,大部分浏览器会验证证书中的域名与它们所对话的服务器域名是否匹配。
*为什么最后互发所有握手报文的MAC?
最后两个步骤(5、6)是为了避免握手被篡改:
- 因为在第一步客户端提供算法的列表是以明文发送的,中间人可以从列表中删除较强的算法从而迫使客户选择较弱的算法。
- 为了防止这种篡改攻击,步骤5中客户发送一个级联它已发送和接收的所有握手报文的MAC,服务器能够比较这个MAC与它发送和接收的握手报文的MAC,如果不一致,服务器可以终止该连接。同样,客户也可以通过步骤6来检查不一致性。
*为什么步骤1和2的报文包含不重数?
- 为了防止重放攻击(Replay Attacks),重放攻击是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的。
- 假如中间人嗅探了客户端和服务器之间所有的报文,第二天冒充客户并向服务器发送前一天客户所发送的相同的报文序列,如果没有使用不重数,则服务器接收到的每个报文都将通过完整性检查。
-
连接关闭 在类型字段中指出该记录是否是用于终止该SSL会话的。(尽管SSL类型是以明文形式发送的,但在接收方使用了记录的MAC对它进行了鉴别)
- 如果只是让客户端通过直接终止底层的TCP连接来结束该SSL会话,即发送一个TCP FIN报文段,则可能会遭到截断攻击(truncation attack):
- 中间人用TCP FIN过早地结束了该会话,服务器则会认为其收到了 客户的所有数据,而实际上它仅收到了其中的一部分。
- 而通过类型字段识别该记录是否是用于终止该SSL会话,那么服务器如果在收到一个关闭SSL记录之前突然收到了一个TCP FIN,它就可能知道事有蹊跷。
3)网络安全相关
安全通信(secure communication)具有下列所需的特性:
- 机密性(confidentiality):仅发送方和接收方可理解报文的内容,因此要求报文在一定程度上进行加密。
- 报文完整性(message integrity):通信内容在传输过程中未被改变。
- 端点鉴别(end-point authentication):发送方和接收方都能证实通信的实际另一方确实具有所声称的身份。
- 运行安全性(operational security):防火墙和入侵检测系统等运行设备用于反制对机构网络的攻击。
3.1 数字加密技术常见术语
- 密码(cipher):一种特殊的报文编码以及对应解码方式的方案。
- 明文(plaintext or cleartext):加密前的原始报文
- 密文(ciphertext):加密后的编码报文
- 密钥(key):改变密码行为的数字化参数。
- 同一条内容通过同一台编码机进行传输,会随密钥值的不同而产生不同的输出。
- 如果没有正确的密钥,解密过程无法正确进行。
- 对称密钥加密系统:编/解码使用相同密钥的算法。
- 对称密钥加密(symmetric-key)技术:编码时使用的密钥值和解码时一样(e=d,统称为k),发送端和接收端要共享相同的密钥k才能进行通信。
- 流行的对称密钥加密算法包括:DES、Triple-DES、RC2、RC4。
- 不对称密钥加密系统:编/解码使用不同密钥的算法
- 公开密钥加密系统:一种能够使数百万计算机便捷地发送机密报文的系统。
- 公开密钥加密技术使用了两个非对称密钥,一个用来对主机报文编码(众所周知),一个用来对主机报文解码(只有主机才知道私有的解密密钥)。
- RSA算法是流行的公开密钥加密系统:确保了即使获取到公开的密钥、拦截的部分密文、一条报文及与之相关的报文,也无法计算出保密的私有密钥。
- 数字签名(digital signature):是附加在报文上的特殊加密校验和,用来验证报文并未伪造或篡改。
- 只有作者才有最机密的私有密钥,才能算出这些校验和。
- 因为校验和只有作者保密的私有密钥才能产生,所以攻击者无法为篡改了的报文伪造出正确的校验和。
- 数字签名通常是用非对称公开密钥技术产生的。
- 数字证书(certs):由一个可信的组织验证和签发的识别信息,通常包含:
- 对象的名称(人、服务器、组织等)
- 过期时间
- 证书发布者(谁为证书担保)
- 来自证书发布者的数字签名
3.2 端点鉴别
端点鉴别就是一个实体通过网络向另一个实体证明其身份的过程。
- 鉴别协议1.0:直接说明自己的身份。(缺陷:中间人也可冒充)
- 鉴别协议2.0:验证携带鉴别报文的源IP。(缺陷:IP哄骗)
- 鉴别协议3.0:使用密码口令,即鉴别者和被鉴别者之间的一个共享秘密。(缺陷:未加密的口令可被窃听到)
- 鉴别协议3.1:加密口令。(缺陷:受制于回放攻击,playback attack,即只需要窃听并记录下口令的加密版本,并回放)
- 鉴别协议4.0:使用不重数nonce,即在一个协议的生存期中只使用一次的数。
4)面试常问之HTTP和HTTPS的区别?
- HTTP 明文传输,数据都是未加密的,安全性较差,HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好。
- 使用 HTTPS 协议需要到 CA(Certificate Authority,数字证书认证机构) 申请证书,一般免费证书较少,因而需要一定费用。
- 证书颁发机构如:Symantec、Comodo、GoDaddy 和 GlobalSign 等。
- HTTP 页面响应速度比 HTTPS更快 。
- 主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包。
- 而 HTTPS除了 TCP 的三个包,还要加上SSL握手需要的 9 个包,所以一共是 12 个包。
- http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
- HTTPS 其实就是建构在 SSL/TLS 之上的 HTTP 协议,所以,要比较 HTTPS 比 HTTP 要更耗费服务器资源。
5)面试常问之CA证书是如何保证可靠性的?
- CA认证中心是负责签发,管理,认证数字证书的机构,是基于国际互联网平台建立的一个公正,权威,可信赖的第三方组织机构。
- SSL可以说是建立在CA认证中心的权威,公正,可信赖的基础上的,如果CA认证中心的信息可以被伪造的,那么SSL的一切就完了。
- 权威性:CA证书设备由CA中心颁发,使用其作为身份识别设备具有很高的权威性。
- 不可伪造:数字证书设备经过国家相关部门审核批准,设备中保存的用户私钥无法被读出,不可被伪造。
- 不容易被冒用:使用证书需要同时持有数字证书设备和设备启动口令,缺一不可,因此只要保护好证书设备,他人无法冒用用户身份。
- 不可破解:数字证书设备具有口令保护机制,在连续输入错误一定次数后,设备将被锁定,防止暴力破解。
- 容易保管:数字证书可采用硬件(Usbkey)以及软件(移动APP)为载体,方便携带保管,不易遗失。
- 遗失容易发现:万一数字证书设备遗失,能够及时发现,并采取相应措施。
6)面试常问之会话密钥为什么要用对称密钥?
会话密钥(session key):是保证用户跟其它计算机或者两台计算机之间安全通信会话而随机产生的加密和解密密钥。
- 它可由通信用户之间进行协商得到。
- 一般是动态地、仅在需要进行会话数据加密时产生。
出于效率的考虑:非对称加密虽然相较安全且不用考虑如何交换密钥,但需要较多的资源来进行运算,对于许多需求来说太慢了。
- 对称加密主要的运算是位运算,速度非常快,如果使用硬件计算,速度会更快。
- 非对称加密计算一般都比较复杂,比如 RSA,它里面涉及到大数乘法、大数模等等运算。
- 通过使用非对称加密算法来加密另一个更快速的对称式加密算法的秘密密钥,可以显著提高整体性能,这是PGP和GPG的应用过程。
【部分内容参考自】
- 《HTTP权威指南》
- 《计算机网络–自顶向下方法》
- HTTP 与 HTTPS 的区别:https://www.runoob.com/w3cnote/http-vs-https.html
- CA证书何以成为网络世界中的“身份证”?:https://zhuanlan.zhihu.com/p/33711964
- 为什么非对称加密比对称加密慢?:https://www.jianshu.com/p/4dfcddc7e8ce
|