基础运维基础知识协议

HTTPS基本原理

2018-09-14  本文已影响2332人  晒太阳的仙人掌是个程序媛

一、HTTP为什么不安全?

HTTP协议没有任何的加密以及身份验证的机制,非常容易遭到窃听、劫持、篡改等。不安全的原因主要包含以下三个方面:

下面会逐条分析:

  1. 通信使用明文,内容可能被窃听。

    由于HTTP本身不具备加密的功能,所以也无法做到对通信整体进行加密,HTTP报文使用明文方式发送。 通信使用明文.png
  2. 不验证通信方的身份,因此有可能遭到伪装。
    HTTP协议的实现本身非常简单,不论是谁发送过来的请求都会返回响应,因此不确认通信方,会存在以下各种隐患:

    • a. 无法确定请求发送至目标的Web服务器是否是按真实意图返回响应的那台服务器。有可能是已伪装的Web服务器。
    • b. 无法确定响应返回到的客户端是否是按真实意图接收响应的那个客户端。有可能是已伪装的客户端。
    • c. 无法确定正在通信的对方是否具备访问权限。因为某些Web服务器上保存着重要的信息,只想发给特定用户通信的权限。
    • d. 无法判定请求是来自何方、出自谁手。
      即使是无意义的请求也会照单全收。无法阻止海量请求下的DoS攻击(Denial of Service,拒绝服务攻击)。
  3. 无法验证报文的完整性,所以有可能被篡改。
    所谓完整性是指信息的准确度。若无法证明其完整性,通常也就意味着无法判断信息是否准确。

二、HTTPS如何保证安全

如果在HTTP协议通信过程中使用未经加密的明文,比如在Web页面中输入信用卡号,如果这条通信线路遭到窃听,那么信用卡号就暴露了。

另外,对于HTTP来说,服务器也好,客户端也好,都是没有办法确认通信方的。因为很有可能并不是和原本预想的通信方在实际通信。并且还需要考虑到接收到的报文在通信途中已经遭到篡改这一可能性。

为了统一解决上述这些问题,需要在HTTP上再加入加密处理和认证等机制。我们把添加了加密及认证机制的HTTP称为HTTPS(HTTP Secure)。

经常会在Web的登录页面和购物结算界面等使用HTTPS通信。使用HTTPS通信时,不再用http://,而是改用https://。另外,当浏览器访问HTTPS通信有效的Web网站时,浏览器的地址栏内会出现一个带锁的标记。对HTTPS的显示方式会因浏览器的不同而有所改变。

在采用了SSL后,HTTP就拥有了HTTPS的加密、证书和完整性保护这些功能。
SSL是独立于HTTP的协议,所以不光是HTTP协议,其他运行在应用层的SMTP和Telnet等协议均可配合SSL协议使用。可以说SLL事当今世界上应用最为广泛的网络安全技术。

1. HTTPS是身披SSL外壳的HTTP

HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL 和TLS协议替代而已。通常,HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信。

想要讲清楚为什么使用SSL协议,必须要了解一下加密演化进程,下面介绍一下如今使用比较广泛的几种加密方式。

2. 加密方法简介

近代的加密方法中加密算法是公开的,而密钥却是保密的。通过这种方式得以保持加密方法的安全性。
加密和解密都会用到密钥。没有密钥就无法对密码解密,反过来说,任何人只要持有密钥就能解密了。如果密钥被攻击者获得,那加密也就失去了意义。

2.1. 对称秘钥加密
加密和解密通用一个秘钥的方式称为共享密钥加密(Common key cryptosystem),也被叫做对称秘钥加密 共享密钥加密的困境 .png

以共享密钥方式加密时必须将密钥也发给对方。可究竟怎样才能安全地转交?在互联网上转发密钥时,如果通信被监听那么密钥就可会落入攻击者之手,同时也就失去了加密的意义。另外还得设法安全地保管接收到的密钥。

对称加密又分为两种模式:流加密和分组加密。

对称加密算法的优、缺点:

2.2. 非对称密钥加密

非对称密钥加密有两把秘钥:一把叫做私有密钥(private key),另一把叫做公开密钥(public key),公钥加密,私钥解密。

在非对称密钥交换算法出现以前,对称加密一个很大的问题就是不知道如何安全生成和保管密钥。非对称密钥交换过程主要就是为了解决这个问题,使得对称密钥的生成和使用更加安全。

密钥交换算法本身非常复杂,密钥交换过程涉及到随机数生成,模指数运算,空白补齐,加密,签名等操作。

常见的密钥交换算法有RSA,ECDHE,DH,DHE等算法。涉及到比较复杂的数学问题,下面就简单介绍下最经典的RSA算法。

非对称加密相比对称加密更加安全,但也存在两个明显缺点:

所以公钥加密(极端消耗CPU资源)目前只能用来作密钥交换或者内容签名,不适合用来做应用层传输内容的加解密。

另外,要想根据密文和公钥,恢复到信息原文是异常困难的,因为解密过程就是在对离散对数进行求值,这并非轻而易举就能办到。退一步讲,如果能对一个非常大的整数做到快速地因式分解,那么密码破解还是存在希望的。但就目前的技术来看是不太现实的。

2.3. 混合加密机制

由于使用非对称加密能够保证安全,但是效率却大大降低,所以为了改进这个问题,可以采用混合加密机制:“非对称加密”与“对称加密”混合使用。

既:使用非对称密钥传输“对称密钥”,后续安全获得到“对称密钥”后,再使用“对称密钥”加密通信。

存在的问题:中间人攻击。中间人劫持公钥后,发送给对方伪造公钥,对方用伪造公钥进行加密传输,再次被拦截,用中间人用自己的私钥进行解密,此刻中间人得到了“对称加密密钥”

2.4. SSL & TLS

HTTPS使用SSL(Secure Socket Layer)和TLS(Transport Layer Security)这两个协议。SSL技术最初是由浏览器开发商网景通信公司率先倡导的,开发过SSL3.0之前的版本。目前主导权已转移到IETF(Internet Engineering Task Force,Internet工程任务组)的手中。

IETF以SSL3.0为基准,后又制定了TLS1.0、TLS1.1和TLS1.2。TSL是以SSL为原型开发的协议,有时会统一称该协议为SSL。当前主流的版本是SSL3.0和TLS1.0。由于SSL1.0协议在设计之初被发现出了问题,就没有实际投入使用。SSL2.0也被发现存在问题,所以很多浏览器直接废除了该协议版本。

SSL速度慢吗?

SSL的慢分两种。一种是指通信慢。另一种是指由于大量消耗CPU及内存等资源,导致处理速度变慢。

和使用HTTP相比,网络负载可能会变慢2到100倍。除去和TCP连接、发送HTTP请求·响应以外,还必须进行SSL通信,因此整体上处理通信量不可避免会增加。

另一点是SSL必须进行加密处理。在服务器和客户端都需要进行加密和解密的运算处理。因此从结果上讲,比起HTTP会更多地消耗服务器和客户端的硬件资源,导致负载增强。

针对速度变慢这一问题,并没有根本性的解决方案,我们会使用SSL加速器这种(专用服务器)硬件来改善该问题。该硬件为SSL通信专用硬件,相对软件来讲,能够提高数倍SSL的计算速度。仅在SSL处理时发挥SSL加速器的功效,以分担负载。

2.4.1. 身份认证

HTTPS协议中身份认证的部分是由数字证书来完成的,证书由公钥、证书主体和数字签名等内容组成。

在客户端发起SSL请求后,服务端会将数字证书发给客户端,客户端会对证书进行验证(验证查看这张证书是否是伪造的,也就是公钥是否是伪造的),并获取公钥。

数字证书有两个作用:

证书申请流程:

证书认证流程:

数字签名的制作和验证过程如下:

需要注意的是:

可证明组织真实性的EV SSL证书

作用:用来证明作为通信一方的服务器是否规范,另外一个作用是可确认对方服务器背后运营的企业是否真实存在。拥有该特性的证书就是EV SSL证书(Extended Validation SSL Certificate)。
EV SSL证书是基于国际标准的认证指导方针颁发的证书。其严格规定了对运营组织是否真实的确认方针,因此,通过认证的Web网站能够获得更高的认可度。
持有EV SSL证书的Web网站的浏览器地址栏处有绿色的锁头标识,从视觉上就能一眼辨别出。


EV SSL证书标识.jpg

上述机制的愿意图是为了防止用户被钓鱼攻击,但就效果上来讲,还要打一个问号。很多用户可能不了解EV SSL证书相关的知识,因此也不会留意它。

用以确认客户端身份的客户端证书

HTTPS中还可以使用客户端证书。以客户端证书进行客户端认证,证明服务器正在通信的对方始终是预料之内的客户端,其作用跟服务器证书如出一辙。

但客户端证书仍存在几处问题点。其中的一个问题点是证书的获取及发布。
想获取证书时,用户得自行安装客户端证书。但由于客户端证书是要付费购买的,且每张证书对应到每位用户也就意味着需支付和用户数对等的费用。另外,要让知识层次不同的用户们自行安装证书,这件事本身也充满了各种挑战。

现状是,安全性极高的认证机构可颁发客户端证书但仅用于特殊用途的业务。比如那些可支撑客户端证书支出费用的业务。
例如,银行的网上银行就采用了客户端证书。在登录网银时不仅要求用户确认输入ID和密码,还会要求用户的客户端证书,以确认用户是否从特定的终端访问网银。

客户端证书存在的另一个问题点是,客户端证书毕竟只能用来证明客户端实际存在,而不能用来证明用户本人的真实有效性。也就是说,只要获得了安装有客户端证书的计算机的使用权限,也就意味着同时拥有了客户端证书的使用权限。

2.4.2.数据完整性

数据传输过程中的完整性使用MAC算法来保证。为了避免网络中传输的数据被非法篡改,SSL利用基于MD5或SHA的MAC(Message Autahentication Code)算法来保证消息的完整性。

MAC(Message Autahentication Code)算法是在密钥参与下的数据摘要算法,能将密钥和任意长度的数据转换为固定长度的数据。发送者在密钥的参与下,利用MAC算法计算出消息的MAC值,并将其加在消息之后发送给接收者。接收者利用同样的密钥和MAC算法计算出消息的MAC值,并与接收到的MAC值比较。如果二者相同,则报文没有改变;否则,报文在传输过程中被修改,接收者将丢弃该报文。

由于MD5在实际应用中存在冲突的可能性比较大,所以尽量别采用MD5来验证内容一致性。SHA也不能使用SHA0和SHA1,中国山东大学的王小云教授在2005年就宣布破解了 SHA-1完整版算法。微软和google都已经宣布16年及17年之后不再支持sha1签名证书。MAC算法涉及到很多复杂的数学问题,这里就不多讲细节了。

三、HTTPS的安全通信机制

HTTPS的安全通信机制01.png

步骤1: 客户端通过发送Client Hello报文开始SSL通信。

报文中包含:1.随机数。2.sessionID。3.密文族。

1.随机数

在客户端问候中,有四个字节以Unix时间格式记录了客户端的协调世界时间(UTC)。协调世界时间是从1970年1月1日开始到当前时刻所经历的秒数。在这个例子中,0x2516b84b就是协调世界时间。在他后面有28字节的随机数( random_C ),在后面的过程中我们会用到这个随机数。

2.Session ID

如果出于某种原因,对话中断,就需要重新握手。为了避免重新握手而造成的访问效率低下,这时候引入了session ID的概念, session ID的思想很简单,就是每一次对话都有一个编号(session ID)。如果对话中断,下次重连的时候,只要客户端给出这个编号,且服务器有这个编号的记录,双方就可以重新使用已有的"对话密钥",而不必重新生成一把。
session ID是目前所有浏览器都支持的方法,但是它的缺点在于session ID往往只保留在一台服务器上。所以,如果客户端的请求发到另一台服务器,就无法恢复对话。session ticket就是为了解决这个问题而诞生的,目前只有Firefox和Chrome浏览器支持。

3 密文族(Cipher Suites):

RFC2246中建议了很多中组合,一般写法是"密钥交换算法-对称加密算法-哈希算法,以“TLS_RSA_WITH_AES_256_CBC_SHA”为例:

还有一个很好的功能: SNI(Server Name Indication)。这个的功能比较好,为了解决一个服务器使用多个域名和证书的SSL/TLS扩展。一句话简述它的工作原理就是,在连接到服务器建立SSL连接之前先发送要访问站点的域名(Hostname),这样服务器根据这个域名返回一个合适的CA证书。目前,大多数操作系统和浏览器都已经很好地支持SNI扩展,OpenSSL 0.9.8已经内置这一功能,据说新版的nginx也支持SNI。)

步骤2: Server Hello

服务器可进行SSL通信时,会以Server Hello报文作为应答。和客户端一样,在报文中包含回复三个数据包,包括 Server Hello, Certificate, Certificate Status。服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的。下面分别看一下:

随机数、sessionID和加密族

1.我们得到了服务器的以Unix时间格式记录的UTC和28字节的随机数 (random_S)。

2.Seesion ID,服务端对于session ID 一般会有三种选择 :

3.我们记得在client hello里面,客户端给出了21种加密族,而在我们所提供的21个加密族中,服务端挑选了“TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256”

这就意味着服务端会使用ECDHE-RSA算法进行密钥交换,通过AES_128_GCM对称加密算法来加密数据,利用SHA256哈希算法来确保数据完整性。

步骤3:Certificate

之后服务器发送Certificate报文。报文中包含公开密钥证书。
在前面的https原理研究中,我们知道为了安全的将公钥发给客户端,服务端会把公钥放入数字证书中并发给客户端(数字证书可以自签发,但是一般为了保证安全会有一个专门的CA机构签发),所以这个报文就是数字证书。

步骤4: Server Hello Done

最后服务器发送Server Hello Done报文通知客户端,最初阶段的SSL握手协商部分结束。

步骤5: ClientKeyExchange

客户端验证证书真伪性

客户端验证证书的合法性,如果验证通过才会进行后续通信,否则根据错误情况不同做出提示和操作,合法性验证包括如下:

秘钥交换

这个过程非常复杂,大概总结一下:

此时客户端已经获取全部的计算协商密钥需要的信息:两个明文随机数random_C和random_S与自己计算产生的Pre-master(由客户端和服务器的 pubkey生成的一串随机数),计算得到协商对称密钥;
enc_key=Fuc(random_C, random_S, Pre-Master)

SSL第一次握手结束之后,客户端以Client Key Exchange报文作为回应。报文中包含通信加密中使用的一种被称为Pre-master secret的随机密码串。该报文已用步骤3中的公开密钥进行加密。

步骤6: ChangeCipherSpec

接着客户端继续发送Change Cipher Spec报文。该报文会提示服务器,在此报文之后的通信会采用Pre-master secret密钥加密。

步骤7: Finished

客户端发送Finished报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准。

步骤8: 服务器同样发送Change Cipher Spec报文。

步骤9: 服务器同样发送Finished报文。

步骤10:Application Data(HTTP)

服务器和客户端的Finished报文交换完毕之后,SSL连接就算建立完成。当然,通信会受到SSL的保护。从此处开始进行应用层协议的通信,即发送HTTP请求。

步骤11: Application Data(HTTP)

应用层协议通信,即发送HTTP响应。

步骤12: Close notify

最后由客户端断开连接。断开连接时,发送close_notify报文。上图做了一些省略,这步之后再发送TCP FIN报文来关闭与TCP的通信。

在以上流程中,应用层发送数据时会附加一种叫做MAC(Message Autahentication Code)的报文摘要。MAC能够查知报文是否遭到篡改,从而保护报文的完整性。
下面是对整个流程的图解。图中说明了从仅使用服务器端的公开密钥证书(服务器证书)建立HTTPS通信的整个过程。


HTTPS的安全通信机制02.png

① CBC模式(Cipher Block Chaining)又名密码分组链接模式。在此模式下,将前一个明文块加密处理后和下一个明文块做XOR运算,使之重叠,然后再对运算结果做加密处理。对第一个明文块做加密时,要么使用前一段密文的最后一块,要么利用外部生成的初始向量(initial vector,IV)。

四、为什么不一直使用HTTPS

其中一个原因是,因为与纯文本通信相比,加密通信会消耗更多的CPU及内存资源。如果每次通信都加密,会消耗相当多的资源,平摊到一台计算机上时,能够处理的请求数量必定也会随之减少。

因此,如果是非敏感信息则使用HTTP通信,只有在包含个人信息等敏感数据时,才利用HTTPS加密通信。

特别是每当那些访问量较多的Web网站在进行加密处理时,它们所承担着的负载不容小觑。在进行加密处理时,并非对所有内容都进行加密处理,而是仅在那些需要信息隐藏时才会加密,以节约资源。

除此之外,想要节约购买证书的开销也是原因之一。
要进行HTTPS通信,证书是必不可少的。而使用的证书必须向认证机构(CA)购买。证书价格可能会根据不同的认证机构略有不同。
那些购买证书并不合算的服务以及一些个人网站,可能只会选择采用HTTP的通信方式。

资料参考:图解HTTP

上一篇 下一篇

猜你喜欢

热点阅读