Https流程和原理

1,234 阅读7分钟

一、什么是Https

https简单的说就是安全版http,因为http协议的数据都是明文进行传输的,所以对于一些敏感信息的传输就很不安全,为了安全传输敏感数据,网景公司设计了SSLSecure 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 keyMAC算法密钥,作为后面交互过程中使用对称密钥。同时客户端也会使用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 keyMAC算法的私钥对传输的内容进行加密和解密

具体的步骤先使用MAC密钥内容进行摘要,然后把摘要放在内容的后面使用session key再进行加密。对于客户端发送的数据,服务端收到后,需要先使用client_write_key进行解密,然后使用client_write_MAC_key对数据完整性进行验证。服务端发送的数据,客户端会使用server_write_key和server_write_MAC_key进行相同的操作。


所有内容来源:Https流程和原理