type
status
date
slug
summary
tags
category
password
icon

定义

HTTP over SSL 的简称,即⼯作在 SSL(或 TLS)上的 HTTP。说⽩了就是加密通信的 HTTP。
SSL:Secure Socket Layer → TLS:Transport Layer Security 在 HTTP 之下,TCP 之上增加一个安全层,用于保障 HTTP 的加密传输

工作原理

在客户端和服务器之间协商出⼀套对称密钥,每次发送信息之前将内容加密,收到之后解密,达到内容的加密传输。
💡
为什么不直接⽤⾮对称加密?
⾮对称加密由于使⽤了复杂了数学原理,因此计算相当复杂,如果完全使⽤⾮对称加密来加密通信内容,会严重影响⽹络通信的性能

HTTPS连接建立过程

大致流程
  1. Client Hello
  1. Server Hello
notion image
通过 Wireshark 抓包也可以看到
客户端 Client Holle 请求连接
客户端 Client Holle 请求连接
服务端 Server Hello 响应连接
服务端 Server Hello 响应连接
  1. 服务器证书 信任建⽴
    1. 实际流程图如下:
      notion image
      💡
      为什么要这么麻烦,为什么不直接发送服务器的公钥?
      在不安全网络环境下,假设我们只发送服务器公钥
      服务器发送公钥的途中,公钥可能会被篡改,如何确认服务器公钥的合法性?
      我们可以想到之前的非对称算法的签名功能。对服务器公钥进行一次 Hash计算再通过证书颁发机构 A 的私钥对 Hash 字符串进行一次计算,就能得到证书颁发机构 A 签名后服务器公钥(这里称为【服务器公钥的签名】),然后只需要再带上服务器公钥的签名和证书颁发机构 A 的公钥就可以解决服务器公钥的合法性。
      但是这里又会有同样的问题,证书颁发机构A的公钥的合法性也无法判断,如果再对证书颁发机构 A 的公钥进行签名,这样就循环反复没有实际解决问题,该怎么办呢? 实际上循环签名的问题时不存在的,操作系统自带(用户也可以自己手动添加)一些根证书,这些根证书的公钥,是用户无条件必须信任的。那么就可以使用根证书机构的私钥对证书颁发机构的的公钥进签名。得到证书颁发机构 A 的公钥的签名,然后把证书颁发机构 A 的公钥的签名一起发送给客户端,变成这样:
      那么客户端拿到数据后,通过系统自带的根证书的公钥对证书颁发机构 A 的公钥的签名进行转换,验证后,得到可信任证书颁发机构 A 的公钥,然后,又可以通过证书颁发机构 A 的公钥对服务器公钥的签名进行转换,验证后,就得到了可信任服务器公钥
      通过 Wireshark 也可以看到:
      notion image
      notion image
      浏览器也可查看证书的关系:
      notion image
      系统也可以看到证书的位置:
      notion image
      💡
      另外说一下证书颁发机构的证书指的是什么? 通过上面的流程图和 Wireshark 的分析:
      客户端验证服务器证书
    2. 验证服务器公钥的合法性。
    3. 验证证书中的域名和实际访问的域名是否一致,不一致就验证不通过。
  1. Pre-master Secret
notion image
💡
为什么需要客户端随机数,服务端随机数和 Pre Secret 随机数三个随机数? 首先客户端随机数和服务端随机数是未加密通信时互相传输的。Pre-master Secret 是加密时传输的。 服务器随机数是未了防止重放攻击(replay sttack,指的是抓取到用户请求,原封不动的发给服务端),如果没有服务端随机数,那么服务端会正常处理这个请求。
💡
为什么服务端和客户端通信需要使用两个不同的密钥? 为了防止黑客把客户端发送给服务端的信息返回给客户端,或者把服务端发送给客户端的信息,发送给服务端。如果采用同一个密钥,那么双方在接收到自己的消息,任然会进行解密读取。
💡
什么是 Mac secret? Mac secret 本质是 HMAC(hash-based message authenticate code:基于 Hash 的消息认证码) 原理:把一段数据加上一个密码进行 Hash 计算。 作用:既可以保证消息的可靠性,又可以确认消息的来源(只有拥有密码的人才能计算出同样的 Hash 值) 案例: A 想给 B 发送一段消息(ABCD),A 和 B 约定了一个密码(Xxxx),A 发消息是吧ABCDXxxx 进行一次 Hash 计算得到 jflasjdl,然后把消息内容 ABCD 和 Hash 值 jflasjdl 一起发送给 B,B 拿到消息后,如果直接消息内容 ABCD,但是网络因素可能导致消息内容不正确,所以B通过读取到消息内容加上约定的密码,进行一次 Hash 计算,与读取到的 Hash 进行比较,就既可以确认消息内容的正确性又可以确认消息是由 A 发送的 这里 A 和 B 约定的密码就是 HMAC
  1. 客户端通知:将使⽤加密通信
  1. 客户端发送:Finished 这里的 Finished 会使用 Mac secret 和客户端加密密钥将前面 5 步的握手相关信息加密发送给服务端
    1. notion image
  1. 服务器通知:将使⽤加密通信
  1. 服务器发送:Finished 这里的 Finished 会使用 Mac secret 和服务端的加密密钥将前面 7 步的握手相关信息加密发送给客户端
    1. notion image
  1. 使用对称密钥开始通信
 
notion image
notion image

Https 增强应用

SSL 客户端认证

普遍用于一些金融,银行类的服务
使用用户的 ID 和密码认证也存在安全的问题,而利用 SSL 客户端认证可以避免该情况的发生。
SSL 客户端认证是借由 HTTPS 的客户端证书完成的认证方式,凭借客户端证书认证,服务端可以确认访问是否来自已经登录的客户端。

SSL 客户端认证采用双因素认证

多数情况下,SSL 客户端认证不会仅依靠证书完成认证,一般会和基于表单认证组合形成一种双因素认证来使用,简单来说,就是认证过程中不仅需要密码这一因素,还需要申请认证者提供其他持有信息,从而作为另一个因素与其组合的认证方式。
第一个认证因素的 SSL 客户端证书用来认证客户端计算机,另一个认证因素的密码则用来确认这是用不本人的行为
SSL 客户端认证的必要费用:客户端认证是需要收费的,所以一般只有大型公司需要安全性比较强的服务才会提供。并承担费用,给用户使用
 
Kotlin-基础登录和授权
Loading...
shuouyang
shuouyang
android开发 ReactNative开发 小程序开发
最新发布
AOSP 环境搭建
2025-3-29
View 绘制流程-源码解析
2025-3-12
HTTP
2025-3-4
JVM 虚拟机
2025-2-28
蓝牙-BLE-基础
2025-2-28
从 OkHttp 的原理来看 HTTP
2025-2-19
公告
🎉热点信息🎉
--- 1 ---
Jet Brains 推出新的跨平台支持 Kotlin MultiPlatform
--- 2 ---
新的小巧便捷的依赖注入框架 Koin
--- 3 ---
新一代 API 查询语言 GraphQL