# HTTPS 基础
# 工作流程
HTTPS 采取的是混合加密的方式,简单来说就是通过非对称加密的方式来传输对称密钥,采用对称加密的方式来传输之后的数据。
- Client 发起一个 HTTPS 的请求 Client Hello (TLS 连接)到服务器,同时会告诉自己支持的加密算法
- Server从客户端发来的加密算法中,选出一组加密算法和HASH算法(注,HASH也属于加密),并将自己的身份信息以证书的形式发回给客户端。而证书中包含了网站的地址,加密用的公钥,以及证书的颁发机构等(这里,服务器就将自己用来加密用的公钥一同发还给客户端)
- Client 验证公钥证书:比如是否在有效期内,证书的用途是不是匹配 Client 请求的站点,是不是在 CRL 吊销列表里面,它的上一级证书是否有效,这是一个递归的过程,直到验证到根证书(操作系统内置的 Root 证书或者 Client 内置的 Root 证书)。如果验证通过则继续,不通过则显示警告信息。
- Client 使用
伪随机数生成器
生成加密所使用的会话密钥
,然后用证书的公钥
加密这个会话密钥,发给 Server - Server 使用自己的私钥解密这个消息,得到
会话密钥
。至此,Client 和 Server 双方都持有了相同的会话密钥(对称密钥) - Server 使用对称密钥加密明文内容 A,发送到 Client
- Client 使用对称密钥解密响应的密文,得到明文内容 A
- Client 再次发起 HTTPS 的请求,使用对称密钥加密请求的
明文内容B
,然后 Server 使用对称密钥解密密文,得到明文内容B
。
可以参考图:
Note: 上述的认证过程是一个单向的认证过程,仅仅验证了服务器的身份,并没有验证客户端的身份。这是因为通常单向认证通过后已经建立了安全通信,用账号、密码等简单的手段就能够确认用户的真实身份。但为了防止账号、密码被盗,有的时候(比如网上银行)还会使用 U 盾给用户颁发客户端证书,实现双向认证,这样子会更加的安全。
为什么不直接全程使用非对称加密算法进行数据传输?
这个问题的答案是因为非对称算法的效率对比起对称算法来说,要低得多得多;因此往往只用在HTTPS的握手阶段。
# HTTPS 对比 HTTP
HTTPS 比 HTTP 更加安全,对搜索引擎更友好,利于 SEO,谷歌、百度优先索引 HTTPS 网页; HTTPS 需要用到 SSL 证书,而 HTTP 不用; HTTPS 标准端口 443,HTTP 标准端口 80; HTTPS 基于传输层,HTTP 基于应用层; HTTPS 在浏览器显示绿色安全锁,HTTP 没有显示;
# HTTPS 中用到的加密算法
对称加密算法:AES, chacha20
非对称加密算法:RSA, ECC
HASH算法:MD5, SHA1, SHA256,SHA384
椭圆曲线算法: ECDHE