原文 HTTPS 原理
一、概念和定义
首先明确几个基本概念:
1、名词解释
1.1、密钥对
在非对称加密技术中,有两种密钥,分为私钥和公钥,私钥是密钥对所有者持有,不可公布,公钥是密钥对持有者公布给他人的。
1.2、公钥和私钥
公钥用来给数据加密,用公钥加密的数据只能使用私钥解密。私钥用来解密公钥加密的数据。
1.3、摘要
摘要就是对需要传输的文本,做一个HASH计算,一般采用SHA1,SHA2来获得。
1.4、签名
使用私钥对需要传输的文本的摘要进行加密,得到的密文即被称为该次传输过程的签名。
1.5、签名验证
数据接收端,拿到传输文本,但是需要确认该文本是否就是发送发出的内容,中途是否曾经被篡改。
因此拿自己持有的公钥对签名进行解密(密钥对中的 一种密钥加密的数据必定能使用另一种密钥解密。),得到了文本的摘要,然后使用与发送方同样的HASH算法计算摘要值,再与解密得到的摘要做对比,发现二 者完全一致,则说明文本没有被篡改过。
2、理论
在 签名过程中,收到数据的一方需要自己保管好公钥,但是每一个发送方都有一个公钥,接收数据的人需要保存非常多的公钥,这根本就管理不过来。并且本地保存的公钥有可能被篡改替换,无从发现。
怎么解决这一问题呢,这时候就轮到CA登场了!!
CA是一个统一的证书管理机构,管理所有需要发送数据方的公钥,对公钥进 行认证和加密。认证加密后的公钥即是证书,又称为CA证书,证书中包含了很多信息,最重要的是申请者的公钥。
CA 机构在给公钥加密时,用的是一个统一的密钥对,在加密公钥时,用的是其中的私钥。
这样,申请者拿到证书后,在发送数据时,用自己的私钥生成签名,将签名、 证书和发送内容一起发给对方,对方拿到了证书后,需要对证书解密以获取到证书中的公钥,解密需要用到CA机构的”统一密钥对“中的公钥,这个公钥也就是我 们常说的CA根证书。
通常我们到证书颁发机构去下载并安装到相应的收取数据的客户端,如:浏览器上面。这个公钥只需要安装一次。有了这个公钥之后,就可 以解密证书,拿到发送方的公钥,然后解密发送方发过来的签名,获取摘要,重新计算摘要,作对比,以验证数据内容的完整性。
HTTPS就是综合用了加密解密和数字签名的实例,理解了上述概念和过程,结合密钥对交换的过程就不难理解HTTPS。
3、进阶
HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。
TLS/SSL协议不仅仅是一套加密传输的协议,更是一件经过艺术家精心设计的艺术品,TLS/SSL中使用了非对称加密,对称加密以及HASH算法。
握手过程的简单描述如下:
1.浏览器将自己支持的一套加密规则发送给网站。
2.网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
3.获得网站证书之后浏览器要做以下工作:
a) 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
b) 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。
c) 使用约定好的HASH计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。
4.网站接收浏览器发来的数据之后要做以下的操作:
a) 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。
b) 使用密码加密一段握手消息,发送给浏览器。
5.浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。
这里浏览器与网站互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。另外,HTTPS一般使用的加密与HASH算法如下:
非对称加密算法:RSA,DSA/DSS
对称加密算法:AES,RC4,3DES
HASH算法:MD5,SHA1,SHA256
其中非对称加密算法用于在握手过程中加密生成的密码,对称加密算法用于对真正传输的数据进行加密,而HASH算法用于验证数据的完整性。
由于浏览器生成的密码是整个数据加密的关键,因此在传输的时候使用了非对称加密算法对其加密。
非对称加密算法会生成公钥和私钥,公钥只能用于加密数据,因此可以随意传输,而网站的私钥用于对数据进行解密,所以网站都会非常小心的保管自己的私钥,防止泄漏。
TLS握手过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私信息的传输。
正是由于HTTPS非常的安全,攻击者无法从中找到下手的地方,于是更多的是采用了假证书的手法来欺骗客户端,从而获取明文的信息,但是这些手段都可以被识别出来
4、SSL、TLS
SSL由从前的网景公司开发,有1,2,3三个版本,但现在只使用版本3
TLS是SSL的标准化后的产物 有1.0 1.1 1.2三个版本, 目前在用1.0, TLS1.0和SSL3.0几乎没有区别
事实上我们现在用的都是TLS,但因为历史上习惯了SSL这个称呼 平常还是以SSL为多
二、HTTPS通讯过程
HTTPS能够加密信息,从而避免敏感信息被第三方获取。很多的银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。
HTTPS 由两部分组成:HTTP +SSL / TLS,就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。
服务端的配置
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。
区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl就是个不错的选择,有1年的免费服务)。
这套证书其实就是一对公钥和私钥。
如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。
1. 客户端发起HTTPS请求
用户从浏览器输入https网址,连接到服务器的443端口。
2. 服务端接收请求,给客户端返回证书
证书其实就是公钥,当然包含了很多信息,如证书的颁发机构,过期时间等。
3. 客户端解析证书
客户端会验证公钥是否有效,比如颁发机构,过期时间等等:
如果发现异常,则会弹出一个警告框,提示证书存在问题。
如果证书没有问题,那么就生成一个随机值。然后用证书对该随机值进行加密。就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。
4. 客户端向服务端发送加密后的随机值
客户端发送给服务端用证书加密后的随机值,让服务端得到这个随机值,之后客户端和服务端的通信通过这个随机值来进行加密解密。
5. 服务端用私钥解密收到的加密随机值,解出随机值
服务端用私钥解密得到客户端传来的随机值(私钥),然后把内容通过该值进行对称加密。
所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。
6. 服务端向客户端发送加密后的信息
这部分信息是服务端用私钥加密后的信息,可以在客户端被还原。
7. 客户端解密信息
客户端用之前生成的私钥解密服务端传过来的信息,于是获取了解密后的内容。
这个过程第三方即使监听到了数据,也没法解密。