注:本文参考自网络上的多篇HTTPS相关文章,本人根据本身的理解,进行一些修改,综合。html
1. 必要的加密解密基础知识git
1)对称加密算法:就是加密和解密使用同一个密钥的加密算法。由于加密方和解密方使用的密钥相同,因此称为称为对称加密,也称为单钥加密方法。算法
优势是:加密和解密运算速度快,因此对称加密算法一般在消息发送方须要加密大量数据时使用;浏览器
缺点是:安全性差,若是一方的密钥遭泄露,那么整个通讯就会被破解。另外加密以前双方须要同步密钥;安全
经常使用对称加密算法有:DES、3DES、TDEA、Blowfish、RC二、RC四、RC五、IDEA、SKIPJACK、AES等;服务器
2)非对称加密算法:而非对称加密算法须要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。网络
公钥和私钥是一对:公钥用来加密,私钥解密,并且公钥是公开的,私钥是本身保存的,不须要像对称加密那样在通讯以前要先同步秘钥。session
有点是:安全性更好,私钥是本身保存的,不须要像对称加密那样在通讯以前要先同步秘钥。post
缺点是:加密和解密花费时间长、速度慢,只适合对少许数据进行加密。网站
经常使用的非对称加密算法有:RSA、Elgamal、Rabin、D-H、ECC等;
3)HASH算法:也称为消息摘要算法。将任意长度的二进制值映射为较短的固定长度的二进制值,该二进制值称为哈希值。
经常使用于检验数据的完整性,检验数据没有被篡改过。常见的又 MD5(MD系列),SHA-1(SHA系列)
HTTPS 使用到了上面所有三种加密算法。
2. HTTPS 的做用
HTTPS简单而言,即便创建在SSL/TLS协议之上的HTTP。不使用SSL/TLS的HTTP通讯,就是不加密的通讯。全部信息明文传播,带来了三大风险。
(1) 窃听风险(eavesdropping):第三方能够获知通讯内容。
(2) 篡改风险(tampering):第三方能够修改通讯内容。
(3) 冒充风险(pretending):第三方能够冒充他人身份参与通讯。
SSL/TLS协议是为了解决这三大风险而设计的,但愿达到:
(1) 全部信息都是加密传播,第三方没法窃听。
(2) 具备校验机制,一旦被篡改,通讯双方会马上发现。
(3) 配备身份证书,防止身份被冒充。
互联网是开放环境,通讯双方都是未知身份,这为协议的设计带来了很大的难度。并且,协议还必须可以经受全部匪夷所思的攻击,这使得SSL/TLS协议变得异常复杂。
3. HTTPS 的历史
互联网加密通讯协议的历史,几乎与互联网同样长。
1994年,NetScape公司设计了SSL协议(Secure Sockets Layer)的1.0版,可是未发布。
1995年,NetScape公司发布SSL 2.0版,很快发现有严重漏洞。
1996年,SSL 3.0版问世,获得大规模应用。
1999年,互联网标准化组织ISOC接替NetScape公司,发布了SSL的升级版TLS 1.0版。
2006年和2008年,TLS进行了两次升级,分别为TLS 1.1版和TLS 1.2版。最新的变更是2011年TLS 1.2的修订版。
目前,应用最普遍的是TLS 1.0,接下来是SSL 3.0。可是,主流浏览器都已经实现了TLS 1.2的支持。
TLS 1.0一般被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3。
4. 基本的运行过程
HTTPS 的基本运行过程:
1)利用对称加密算法来加密网页内容,那么如何保证对称加密算法的秘钥的安全呢?
2)使用非对称加密算法来得到对称加密算法的秘钥,从而保证了对称加密算法的秘钥的安全,也就保证了对称加密算法的安全。
这里这样安排使用的原理是,利用了对称加密算法和非对称加密算法优势,而避免了它们的缺点。利用了对称加密算法速度快,而非对称加密算法安全的优势;同时巧妙的避免了对称加密算法的不安全性,以及须要同步密钥的缺点,也避免了非对称加密算法的速度慢的缺点。实在是巧妙了。
这里有两个问题:
(1)如何保证非对称加密算法公钥不被篡改?
解决方法:将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。
(2)公钥加密计算量太大,如何减小耗用的时间?
解决方法:每一次对话(session),客户端和服务器端都生成一个"对话密钥"(session key),用它来加密信息。因为"对话密钥"是对称加密算法,因此运算速度很是快,而服务器公钥只用于加密"对话密钥"自己,这样就减小了加密运算的消耗时间。(也就是网页内容的加密使用的是对称加密算法)
所以,SSL/TLS协议的基本过程是这样的:
(1) 客户端向服务器端索要并验证非对称加密算法的公钥。
(2) 双方协商生成对称加密算法的"对话密钥"。
(3) 双方采用对称加密算法和它的"对话密钥"进行加密通讯。
上面过程的前两步,又称为"握手阶段"(handshake)。
5. 握手阶段的详细过程
"握手阶段"涉及四次通讯,咱们一个个来看。须要注意的是,"握手阶段"的全部通讯都是明文的。
1) 客户端发出请求(ClientHello)
首先,客户端(一般是浏览器)先向服务器发出加密通讯的请求,这被叫作ClientHello请求。
在这一步,客户端主要向服务器提供如下信息。
(1) 浏览器支持的SSL/TLS协议版本,好比TLS 1.0版。
(2) 一个浏览器客户端生成的随机数,稍后用于生成对称加密算法的"对话密钥"。
(3) 浏览器支持的各类加密方法,对称的,非对称的,HASH算法。好比RSA非对称加密算法,DES对称加密算法,SHA-1 hash算法。
(4) 浏览器支持的压缩方法。
这里须要注意的是,客户端发送的信息之中不包括服务器的域名。也就是说,理论上服务器只能包含一个网站,不然会分不清应该向客户端提供哪个网站的数字证书。这就是为何一般一台服务器只能有一张数字证书的缘由。
对于虚拟主机的用户来讲,这固然很不方便。2006年,TLS协议加入了一个Server Name Indication扩展,容许客户端向服务器提供它所请求的域名。
2) 服务器回应(SeverHello)
服务器收到客户端请求后,向客户端发出回应,这叫作SeverHello。服务器的回应包含如下内容。
(1) 确认使用的加密通讯协议版本,好比TLS 1.0版本。若是浏览器与服务器支持的版本不一致,服务器关闭加密通讯。
(2) 一个服务器生成的随机数,稍后用于生成对称加密算法的"对话密钥"。
(3) 确认使用的各类加密方法,好比确认算法使用:RSA非对称加密算法,DES对称加密算法,SHA-1 hash算法
(4) 服务器证书。
除了上面这些信息,若是服务器须要确认客户端的身份,就会再包含一项请求,要求客户端提供"客户端证书"。好比,金融机构每每只容许认证客户连入本身的网络,就会向正式客户提供USB密钥,里面就包含了一张客户端证书。
3) 客户端回应
客户端收到服务器回应之后,首先验证服务器证书。若是证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已通过期,就会向访问者显示一个警告,由其选择是否还要继续通讯。
若是证书没有问题,客户端就会从证书中取出服务器的非对称加密算法的公钥。而后,向服务器发送下面三项信息。
(1) 一个随机数。该随机数用服务器发来的公钥进行的使用非对称加密算法加密,防止被窃听。
(2) 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送(好比确认使用:RSA非对称,DES对称,SHA-1 hash算法)。
(3) 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的全部内容的hash值,用来供服务器校验。
上面第一项的随机数,是整个握手阶段出现的第三个随机数,又称"pre-master key"。有了它之后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的对称加密算法,各自生成本次会话所用的同一把"会话密钥"。也就是说浏览器和服务器各自使用同一个对称加密算法,对三个相同的随机数进行加密,得到了,用来加密网页内容的 对称加密算法的秘钥。(注意:这里浏览器的三个随机数都是明文的,可是服务端得到的"pre-master key"是密文的,因此服务器须要使用非对称加密算法的私钥,来先解密得到"pre-master key"的明文,在来生成对称加密算法的秘钥。这样的目的是为了防止:"pre-master key"被窃听,由于发送明文会被窃听,可是发生的是非对称加密算法的加密事后的密文,由于窃听者不知道私钥,因此即便窃听了,也没法解密出其对应的明文。从而保证了最后生成的:用于加密网页内容的对称加密算法的秘钥的安全性!!!)
至于为何必定要用三个随机数,来生成"会话密钥",dog250解释得很好:
"不论是客户端仍是服务器,都须要随机数,这样生成的密钥才不会每次都同样。因为SSL协议中证书是静态的,所以十分有必要引入一种随机因素来保证协商出来的密钥的随机性。
对于RSA密钥交换算法来讲,pre-master-key自己就是一个随机数,再加上hello消息中的随机,三个随机数经过一个密钥导出器最终导出一个对称密钥。
pre master的存在在于SSL协议不信任每一个主机都能产生彻底随机的随机数,若是随机数不随机,那么pre master secret就有可能被猜出来,那么仅适用pre master secret做为密钥就不合适了,所以必须引入新的随机因素,那么客户端和服务器加上pre master secret三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能彻底不随机,但是是三个伪随机就十分接近随机了,每增长一个自由度,随机性增长的 可不是一。"
这里:其实若是 pre-master-key 和 浏览器生成的随机数均可能被猜出来,那么最后生成的对称加密算法的秘钥就是不安全的。由于三个随机数均可能被窃听到了。
此外,若是前一步,服务器要求客户端证书,客户端会在这一步发送证书及相关信息。
4) 服务器的最后回应
服务器收到客户端的第三个随机数pre-master key以后,计算生成本次会话所用的对称加密算法的"会话密钥"。而后,向客户端最后发送下面信息。
(1)编码改变通知,表示随后的信息都将用双方商定的对称加密算法和密钥进行加密。
(2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的全部内容的hash值,用来供客户端校验。
至此,整个握手阶段所有结束。接下来,客户端与服务器进入加密通讯,就彻底是使用普通的HTTP协议,只不过用"会话密钥"加密内容。
参考连接
(完)
=======================================
注:
本文主要修改自:SSL/TLS协议运行机制的概述
仅仅按照本身的理解,进行了一些修改,和补充,以利于本身理解。可能会存在本身理解上的错误。
另外参考了:HTTPS那些事(一)HTTPS原理
本文若是结合 HTTPS链接的前几毫秒发生了什么 一块儿来理解HTTPS,将理解的更加深刻。
总结:
1)HTTPS 结合使用了 非对称加密算法,对称加密算法,hash算法,分别利用他们的优点,避免他们的缺点。利用非对称加密算法得到对称加密算法的秘钥,保证他的安全性;而后实际的网页内容的加密使用的是对称加密算法,利用了对称加密算法速度快的优点,hash算法主要是防止篡改的发生,是一种校验机制,最后数字证书,保证了服务器在将非对称加密算法的公钥传给浏览器时的安全性(不会被中间人篡改),同时也标志了服务器的身份。
2)HTTPS的四大金刚:
非对称加密算法(对称加密算法的秘钥) + 对称加密算法(加密内容) + 数字证书(防止篡改非对称加密算法的公钥) + HASH算法(防止篡改消息)== HTTPS
3)HTTPS的本质是什么?
HTTPS的本质就是在HTTP链接发起以前,先使用SSL/TLS协议,协调客户端和服务端,在两端各自生产一个对称加密算法的秘钥,
而后使用普通的HTTP协议传输 通过对称加密算法加密的网页内容。由于对称加密算法的秘钥是安全的,因此对称加密算法加密的网页内容也是安全的。