1. 由来
HTTP
请求都是明文传输的,所谓的明文指的是没有经过加密的信息,如果HTTP请求被黑客拦截
,并且里面含有敏感数据的话,会非常危险。为了解决这个问题,Netscape 公司制定了HTTPS
协议,HTTPS
可以将数据加密传输
,也就是传输的是密文,即便黑客在传输过程中拦截到数据也无法破译,这就保证了网络通信的安全。
2. 密码学基础
在正式讲解HTTPS协议之前,我们首先要知道一些密码学的知识。
明文
: 明文指的是未被加密过的原始数据。
密文
:明文被某种加密算法加密之后,会变成密文,从而确保原始数据的安全。密文也可以被解密,得到原始的明文。
密钥
:密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥与非对称密钥,分别应用在对称加密和非对称加密上。
对称加密
:对称加密又叫做私钥加密
,即信息的发送方和接收方使用同一个密钥去加密和解密数据
。对称加密的特点是算法公开、加密和解密速度快,适合于对大数据量进行加密,常见的对称加密算法有DES、3DES、TDEA、Blowfish、RC5和IDEA。
其加密过程如下:明文 + (加密算法 + 私钥) => 密文
解密过程如下: 密文 + (解密算法 + 私钥) => 明文
对称加密中用到的密钥叫做私钥,私钥表示个人私有的密钥,即该密钥不能被泄露
。
其加密过程中的私钥与解密过程中用到的私钥是同一个密钥,这也是称加密之所以称之为“对称”的原因。由于对称加密的算法是公开的,所以一旦私钥被泄露,那么密文就很容易被破解,所以对称加密的缺点是密钥安全管理困难。
非对称加密
:非对称加密也叫做公钥加密。非对称加密与对称加密相比,其安全性更好。对称加密的通信双方使用相同的密钥,如果一方的密钥遭泄露,那么整个通信就会被破解。而非对称加密使用一对密钥,即公钥和私钥,且二者成对出现。私钥被自己保存,不能对外泄露。公钥指的是公共的密钥,任何人都可以获得该密钥。用公钥或私钥中的任何一个进行加密,用另一个进行解密。
被公钥加密过的密文只能被私钥解密,过程如下:
明文 + (加密算法 + 公钥) => 密文
, 密文 + (解密算法 + 私钥) => 明文
被私钥加密过的密文只能被公钥解密,过程如下:
明文 + (加密算法 + 私钥) => 密文
, 密文 + (解密算法 + 公钥) => 明文
由于加密和解密使用了两个不同的密钥
,这就是非对称加密“非对称”的原因。
非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
在非对称加密中使用的主要算法有:RSA、Elgamal、Rabin、D-H、ECC(椭圆曲线加密算法)等。
3. https通信过程
HTTPS = HTTP + SSL/TLS
,在HTTPS数据传输的过程中,需要用SSL/TLS对数据进行加密和解密
,需要用HTTP对加密后的数据进行传输,由此可以看出HTTPS是由HTTP和SSL/TLS一起合作完成的。
HTTPS在传输的过程中会涉及到三个密钥:
服务器端的公钥和私钥
,用来进行非对称加密
客户端生成的随机密钥
,用来进行对称加密
1、
客户端向服务器发起HTTPS请求
,根据RFC2818的规定,Client知道需要连接Server的443(默认)端口。
1、 支持的协议版本,比如TLS 1.0版。
2、 支持的加密方法,比如RSA公钥加密。
3、 支持的压缩方法。
2、
服务器端有一个密钥对
,即公钥和私钥,Server把事先配置好的公钥证书(public key certificate)返回给客户端。
SSL 证书中包含的具体内容有:
(1)证书的发布机构CA
(2)证书的有效期
(3)公钥
(4)证书所有者
(5)签名
1、 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
2、 确认使用的加密方法,比如RSA公钥加密。
3、
Client验证公钥证书
:比如是否在有效期内,证书的用途是不是匹配Client请求的站点,是不是在CRL吊销列表里面,它的上一级证书是否有效,这是一个递归的过程,直到验证到根证书(操作系统内置的Root证书或者Client内置的Root证书)。如果验证通过则继续,不通过则显示警告信息。
(1)首先浏览器读取证书中的证书所有者、有效期等信息进行一一校验
(2)浏览器开始查找操作系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA比对,用于校验证书是否为合法机构颁发
(3)如果找不到,浏览器就会报错,说明服务器发来的证书是不可信任的。
(4)如果找到,那么浏览器就会从操作系统中取出 颁发者CA 的公钥,然后对服务器发来的证书里面的签名进行解密
(5)浏览器使用相同的hash算法计算出服务器发来的证书的hash值,将这个计算的hash值与证书中签名做对比
(6)对比结果一致,则证明服务器发来的证书合法,没有被冒充
(7)此时浏览器就可以读取证书中的公钥,用于后续加密了
4、
Client使用伪随机数生成器生成加密所使用的对称密钥,然后用证书的公钥加密这个对称密钥
,发给Server
。
5、
Server使用自己的私钥(private key)解密这个消息,得到对称密钥。至此,Client和Server双方都持有了相同的对称密钥。
6、
Server使用对称密钥加密“明文内容A”,发送给Client。
7、
Client使用对称密钥解密响应的密文,得到“明文内容A”。
8、
Client再次发起HTTPS的请求,使用对称密钥加密请求的“明文内容B”,然后Server使用对称密钥解密密文,得到“明文内容B”。