一、什么是Https
https
简单的说就是安全版的http
,因为http协议的数据都是明文进行传输的,所以对于一些敏感信息的传输就很不安全,为了安全传输敏感数据,网景公司设计了SSL
(Secure Socket Layer
),在http
的基础上添加了一个安全传输层,对所有的数据都加密后再进行传输,客户端和服务器端收到加密数据后按照之前约定好的密钥解密。
二、加密和解密
https的发展和密码学的发展是分不开的。大家应该知道假面方式可以大体分为对称加密和非对称加密
1、对称加密
加密和解密都使用同一个密钥,这种方式优点是速度快,缺点就是在管理和分配密钥时不安全。
常见的对称加密算法:DES,AES
2、非对称加密
非对称加密有一个密钥对,即公钥和私钥。私钥自己持有,公钥可以公开的发送给使用的人。使用公钥进行加密的信息,只有和其配对的私钥才可以解开。
目前常见的非对称加密算法是RSA,非对称的加密算法的优点是安全,因为他不需要把私钥暴露出去。
在正式的使用场景中一般都是对称加密和非对称加密结合使用,使用非对称加密完成密钥的传递,然后使用对称密钥进行数据的加密和解密。
三、https证书的申请流程
- 在服务器上生成
CSR文件
(证书申请文件,内容包括证书公钥、使用的hash算法、申请的域名、公司名称、职位等信息)。
可以使用命名在服务器上生成;也可以使用线上的工具进行生成,线上的工具会把公钥加入到CSR文件汇总,并同时生成私钥。
- 把CSR文件和其他可能的证件上传到CA认证机构,CA机构收到证书申请后,使用证书中的
HASH算法
,对部分内容进行摘要,然后使用CA机构自己的私钥对这段摘要信息进行签名。
- 然后CA机构把签名过的证书通过邮件形式发送到申请者手中
- 申请者收到证书之后部署到自己的web服务器中。
四、客户端(浏览器)和服务端交互流程
- client Hello,客户端(通常是浏览器)先向服务器发送加密通信的请求
(1)支持的版本协议,如TLS 1.0版本
(2)一个客户端生成的随机数random1,稍后用于生成“对话密钥”
(3)支持的加密方式,比如RSA公钥加密
(4)支持的压缩方法
- 服务器端收到请求,然后响应(server Hello)
(1)确定使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器和服务器的版本不一致,服务器关闭加密通信
(2)一个服务器生成的随机数random2,稍后用于生成“对话密钥”
(3)确认使用的加密方法。比如RSA公钥加密
(4)服务器证书
- 客户端收到证书之后会首先验证证书
验证流程:
(1)我们知道CA机构在签发证书时,都会使用自己的私钥对证书进行签名
证书里的签名算法字段SHA256 RSA表示,CA机构使用SHA256对证书进行摘要,然后使用RSA算法对摘要进行私钥签名,而我们也知道RSA算法中,使用私钥签名之后,只有公钥才能进行验证签名。
(2)如果我们使用的是购买的证书,那么很有可能,颁发该证书的CA机构的公钥已经预置在操作系统中。这样浏览器就可以使用CA机构的公钥对服务器的证书进行验证签名。确定这个证书是不是由正规的CA机构办法的。
验证签名后得到CA机构使用SHA256得到的证书摘要,然后客户端再使用
SHA256对证书内容进行一次摘要,如果得到的值和验证签名之后得到的是相同摘要,则表示证书没有被修改过
(3)如果验证通过,就会显示上面的安全字样,如果服务器购买的证书时更高级的EV类型,就会显示出购证书的时候提供的企业名称。如果没有验证通过,就会显示不安全的提示。
生成随机数
验证通过之后,客户端会生成一个随机数pre-master secret
,然后使用证书中的公钥进行加密,然后传递给服务端。
PreMaster secret
PreMaster secret
是在客户端使用RSA
或者Diffie-Hellman
等加密算法生成的。它将用来跟服务端和客户端在Hello阶段
产生的随机数结合在一起生成Master Secret
。在客户端使用服务端的公钥对PreMaster Secret进行加密后发送给服务端,服务器端将使用私钥解密解密得到PreMaster secret。也就是说服务器端和客户端都有一份相同的Premaster Secret和随机数。
PreMaster Secret
前两个字段是TLS的版本号,这是一个比较重要的用来核对握手数据的版本号,因为在Client Hello阶段,客户端会发送一份加密套件列表和当前支持的SSL/TLS的版本号给服务端,而且是使用明文传送
,如果握手的数据被破解之后,攻击者很有可能改数据表,选择一个安全性较低的加密套件和版本给服务端,从而对数据进行破解。所以服务端需要对密文中解密出来对的PreMaster版本号跟之前Client Hello阶段的版本号进行对比,如果版本号变低,则说明被篡改,则立即停止发送任何信息。
- 服务端收到使用公钥加密的内容,在服务器端使用私钥解密后获得随机数
pre-master secret
,然后根据random1,random2,pre-master secret
通过一定的算法得到session key
和MAC算法密钥,作为后面交互过程中使用对称密钥。同时客户端也会使用random1,random2,pre-master secret,利用同样的算法生成session key和MAC算法的密钥。
生成session key的过程中hi用到PRF(Pseudorandom Funtion伪随机方法)来生成一个key_block,然后在使用key_block生成后面使用的密钥。
在信息交互过程中用到的密钥有6个分别是:客户端分别使用相同的算法生成:
(1)client_write_MAC_key:客户端发送淑女使用摘要MAC算法;
(2)server_write_MAC_key:服务端发送淑女使用摘要MAC算法;
(3)client_write_key:客户端数据加密,服务端解密;
(4)server_write_key:服务端加密,客户端解密;
(5)client_write_IV:初始化向量,运用于分组对称加密;
(6)server_write_IV:初始化向量,运用于分组对称加密。
- 然后再后续的交互中就使用
session key
和MAC算法的私钥对传输的内容进行加密和解密
具体的步骤先使用MAC密钥
对内容进行摘要,然后把摘要放在内容的后面使用session key
再进行加密。对于客户端发送的数据,服务端收到后,需要先使用client_write_key进行解密,然后使用client_write_MAC_key对数据完整性进行验证。服务端发送的数据,客户端会使用server_write_key和server_write_MAC_key进行相同的操作。
所有内容来源:Https流程和原理