Http、Https
type
status
date
slug
summary
tags
category
icon
password
Https
HTTPS 协议(Hyper Text Transfer Protocol Secure),是基于http协议的,并利用了SSL/TLS 协议用作加密和安全认证,是http的加强安全版本。
https加密的原理可以简单概括为:使用对称加密(SSL/TLS)实现传输数据的加解密,使用非对称加密传输对称加密秘钥,使用CA证书签名校验确保非对称加密公钥不被篡改。
加密流程和原理
CA根证书的生成
CA根证书实际上就是一对非对称加密的公私钥,公钥是用私钥加密一些机构信息生成的(通常安装在电脑上的根证书,就是指这个CA的公钥证书文件)。
可用openssl或其它工具完成CA证书的生成,具体见下面的使用场景demo。
在CA根证书生成后,就可以使用根证书对另外一对公私钥生成服务器证书。其原理是使用CA根证书的私钥对服务器证书的公钥添加数字签名以生成服务器证书(其实这个服务器证书可以当作一个中间CA证书,可以基于这个证书生成另外一个服务器证书,形成A→B→C…这种的证书信任链)。
关于数字签名可以看下图:

简单来说,就是对公钥(和一些附加信息)作Hash摘要,然后使用CA根私钥对摘要签名,最终将签名和公钥合在一起形成服务器的证书。这里说一下客户端对服务器证书的校验(已安装CA)
https加密流程
https访问可以分为两个大步骤,分别是:
建立安全的Https通道
这一步的目的是完成客户端和服务器之间会话密钥的传递(SSL/TLS的对称加密密钥)。大概流程如下:

1. 客户端向服务器发送一个请求,请求建立一个安全连接。这个请求被称为 "ClientHello",并且包含客户端支持的加密算法列表和一个随机数。
2. 服务器从客户端提供的加密算法列表中选择一个加密算法,然后生成一个随机数。服务器将这些信息,以及服务器的证书(包含公钥和由 CA 签名的证书信息)一起发送给客户端。这个响应被称为 "ServerHello"。
3. 客户端接收到服务器的响应后,会验证服务器的证书。验证过程包括检查证书是否由可信的 CA 签名,证书是否在有效期内,以及证书的主题(生成证书时指定的域名或IP)是否匹配服务器的地址。如果证书验证通过,客户端会生成一个新的随机数(被称为 "premaster secret"),然后使用服务器的公钥将其加密,发送给服务器。
4. 服务器接收到加密的 "premaster secret" 后,使用自己的私钥解密。然后,客户端和服务器都使用之前交换的三个随机数,通过一个特定的算法生成同样的会话密钥。这个会话密钥将用于后续的所有请求和响应的加密和解密。
上述流程,可以简化描述为:客户端请求服务器,服务器返回自己的证书,客户端使用CA根证书验证服务器公钥是否被篡改,验证通过后,客户端生成会话密钥并用服务器公钥加密会话密钥返回给服务器,服务器拿到后用自己的私钥解密,获取会话密钥,之后客户端和浏览器就可以使用这个密钥加密传输数据。
客户端如何验证服务器公钥是否被篡改?
上面已说明,服务器证书文件是由数字签名和公钥数据组成。客户端获取到服务器证书后,用CA根证书解密数字签名拿到摘要数据,然后将公钥数据作同样的Hash摘要,与解密出的数据作对比,如果一样,则说明没有被篡改。
通信
这一步没什么可说的,拿到密钥后,客户端和服务器就可以对传输数据加解密了。
请注意,即使无法建立安全通道,即在校验服务器证书失败时,客户端也可使用服务器证书中的公钥传输会话密钥,只是会提示不受信任。有些语言的底层实现,在校验证书失败时会直接报错。
扩展-抓包工具解密https(fiddler)
https的安全可靠性是基于根证书的安全,一旦根证书不可信任,整个https就是不安全的。

第一步,Fiddler截获客户端发送给服务器的HTTPS请求,Fiddler伪装成客户端向服务器发送请求进行握手 。
第二步,服务器发回响应,Fiddler获取到服务器的CA证书, 用根证书公钥进行解密, 验证服务器数据签名, 获取到服务器CA证书公钥。然后Fiddler伪造自己的CA证书, 冒充服务器证书传递给客户端浏览器。
第三步,与普通过程中客户端的操作相同,客户端根据返回的数据进行证书校验、生成密码Pre_master、用Fiddler伪造的证书公钥加密,并生成HTTPS通信用的对称密钥enc_key。
第四步,客户端将重要信息传递给服务器, 又被Fiddler截获。Fiddler将截获的密文用自己伪造证书的私钥解开, 获得并计算得到HTTPS通信用的对称密钥enc_key。Fiddler将对称密钥用服务器证书公钥加密传递给服务器。
第五步,与普通过程中服务器端的操作相同,服务器用私钥解开后建立信任,然后再发送加密的握手消息给客户端。
第六步,Fiddler截获服务器发送的密文, 用对称密钥解开, 再用自己伪造证书的私钥加密传给客户端。
第七步,客户端拿到加密信息后,用公钥解开,验证HASH。握手过程正式完成,客户端与服务器端就这样建立了“信任”。
从上面的步骤说明中,其实可以看出来,fiddler能解密https的根本原因是,用户自己安装信任了fiddler的证书,导致服务器发送给客户端的证书被fiddler替换了,fiddler将自己伪装成了服务器。
示例与用法
demo1-内网https
背景:现在有3个应用A、B、C,它们均部署在内网环境中,要求访问A、B、C必须使用https(浏览器),且它们互相存在接口https调用(代码请求,要求数据传输加密)。
这里使用openssl生成CA根证书和服务器证书。
CA根证书生成
demo2-前端csr与后端签发证书
- GitTalk