聊一聊 TLS/SSL
哈喽大家好,我是咸鱼
当我们在上网冲浪的时候,会在浏览器界面顶部看到一个小锁标志,或者网址以 "https://" 开头

这意味着我们正在使用 TLS/SSL 协议进行安全通信。虽然它可能看起来只是一个小小的锁图标和一个 “https” ,但实际上,这个协议在保护我们的在线隐私和安全方面扮演着至关重要的角色
那今天咸鱼就跟大家聊一聊 TLS/SSL 相关的一些知识
阅读文章之前,需要知道:
TLS(Transport Layer Security)和 SSL(Secure Sockets Layer)都是用于加密通信的协议
TLS 是 SSL 的升级版本,它修复了 SSL 中存在的一些安全漏洞,并提供了更高级的安全性
中间人攻击
一天中午,咸鱼在星巴克里打算上网冲浪一下,这时候有一个很坏很坏的人走进了星巴克
坏人建了一个跟星巴克 WI-FI 同名的接入点,当咸鱼上网的时候,稍微不注意连接到了坏人伪造的那个假的星巴克 WI-FI,这就导致咸鱼任何流量请求都在坏人的监控之下
又或者坏人跟咸鱼都连上了星巴克 WI-FI ,然后他通过伪造 DHCP 服务来告诉咸鱼的设备:【我就是网关,要上网的话,让我帮你转发就可以了】
当咸鱼要登陆银行进行转账开始访问银行网站的时候,坏人截获了咸鱼这个请求,并向银行的网站发送一个伪装请求,假装是咸鱼在请求
银行以为这个请求来自于咸鱼,于是返回响应;坏人把这个响应截获了,然后转发到咸鱼的设备上
咸鱼的设备认为这个响应来自于银行,于是咸鱼看到的是一个正常的银行网站登陆界面,便乖乖地输入了登录信息(用户名密码等)
坏人再次截获这些信息,然后将其发送给真正的银行网站,这时候坏人已经拿到了咸鱼的登录信息
同时,他也继续截获所有咸鱼与银行之间的通信,以便访问咸鱼的银行账户或者进行其他恶意活动

这便是中间人攻击(Man-in-the-Middle Attack,简称 MITM 攻击)
中间人攻击是一种计算机安全威胁,攻击者插入自己在通信的两端,窃取或篡改信息
这种攻击可以在不被察觉的情况下进行,因为通信的两方认为他们正在直接相互通信,而实际上信息经过了攻击者的处理
如何避免遭受中间人攻击呢?聪明的小伙伴很快就想到了——通过 HTTPS 来进行加密通信!这样即使信息被截获,坏人也无法轻易解密
TLS/SSL
非对称加密
HTTPS 通过 TLS/SSL 来实现加密传输数据,保证数据在传输的过程中中间人无法解密,这样就保证了数据的安全性
加密数据不是什么难题,通信的时候双方用密钥对数据加密就行了
但如果大家跟银行进行加密通信的时候用的密钥都是一样的,中间人依旧能够使用这个密钥去伪造网站然后截获你的加密数据。这样的话要不要密钥都没啥区别,甚至不还如不要密钥呢
所以最好的情况就是:我跟银行通信的时候协商好用什么密钥——用 A 密钥对数据加密(公钥),然后用 B 密钥对数据解密(私钥),而且:
- A 密钥加密的数据只能 B 密钥解密
- 这个 B 密钥只能我一个人拥有,别人是拿不到的
B 密钥的唯一性,既保证了数据的安全(A 密钥加密的数据只能 B 密钥解密),又能证明我是我(即 B 密钥只能我一个人拥有)
这便是非对称加密技术
非对称加密有两个秘钥,一个是公钥,一个是私钥:
- 公钥会放在互联网上公开;私钥被自己保存,不能对外泄露
- 公钥加密的数据,只有对应的私钥才可以解密
- 只有你有私钥,我才相信你是你
举个例子,首先咸鱼和银行把自己的公钥互相给对方,在通信的时候,咸鱼用银行给的公钥去加密数据并发送给银行,银行拿到之后用自己的私钥解密数据
同理,银行用咸鱼提供的公钥进行数据加密,然后咸鱼拿到加密数据之后用自己的私钥进行解密

TLS/SSL 握手
我们在与银行通信的时候使用 TLS/SSL 加密传输数据,会有经过两个阶段:
- TLS/SSL 握手阶段:用于建立安全的连接通道(非对称加密)
- 数据传输阶段:通道建立好之后,开始传输数据(对称加密)
即在 TLS/SSL 握手阶段使用的是非对称加密技术,数据传输阶段用的是对称加密技术
首先网站会公开自己的公钥(也就是大家常说的“证书”,网站的公钥是通过数字证书公开的)
当浏览器连接到网站时,会先去下载网站的证书
那这里会有一个问题:既然网站的证书是公开的,阿猫阿狗也能下载。那浏览器如何知道这个证书的拥有者即对方就是该网站呢?
聪明的小伙伴肯定会想到:只要能证明对方有私钥就行了!也就是说浏览器用证书(即公钥)加密一个数据,然后发送给对方;如果对方有私钥,那就能解密这个数据并返回给浏览器,那浏览器就知道对方身份了
浏览器会验证证书的有效性(包括验证服务器的身份,检查证书是否过期,是否由受信任的证书颁发机构(CA)签发)
以此来确保正在与合法的网站通信
所以浏览器会生成一个随机数(client random),并使用服务器的公钥对其进行加密,然后将其发送回服务器
服务器使用自己的私钥解密此数据,并使用浏览器的公钥对另一个随机数(server random)进行加密并发送回客户端
这两个随机数将用于生成会话密钥,用于之后的对称加密通信
具体TLS/SSL 握手阶段请看:TLS 详解握手流程 - 掘金 (juejin.cn)
证书颁发机构 CA
前面我们提到:浏览器会去验证证书的有效性,其中包括验证证书是否由受信任的证书颁发机构(CA)签发
这个证书颁发机构(CA,Certification Authority)是一个权威的第三方机构,它的存在是为了告诉浏览器:有我做担保,你们只管信我;只有网站的拥有者,才能拥有网站的证书
即 CA 在这个过程中充当了一个【担保人】的角色,当浏览器拿到网站的证书的时候,会去问 CA :“这个证书是否合法?”
然后 CA 说:“这个证书是合法的!”,浏览器才会信任这个网站
网站需要向 CA 申请证书,CA 要对自己颁发的证书负责
最后
以上就是关于中间人攻击、TLS/SSL、CA 大致的原理和内容,这篇文章花了我较大精力去写,若是文中有不对的地方,欢迎指出
聊一聊 TLS/SSL的更多相关文章
- 使用sslsplit嗅探tls/ssl连接
首先发一个从youtube弄到的sslsplit的使用教程 http://v.qq.com/page/x/k/s/x019634j4ks.html 我最近演示了如何使用mitmproxty执行中间人攻 ...
- SSH/HTTPS安全的本质都依赖于TLS/SSL
1.SSH/HTTPS的安全本质是TLS/SSL. 2.1990年互联网上的网页主要是静态内容,作为信息发布,使用HTTP明文传输是可以的.不过,后来很多公司开始使用网页进行金融交易,例如:股票,于是 ...
- Node.js TLS/SSL
Stability: 3 - Stable 可以使用 require('tls') 来访问这个模块. tls 模块 使用 OpenSSL 来提供传输层(Transport Layer)安全性和(或)安 ...
- TLS / SSL密码强化的建议
TLS / SSL密码强化的建议 传输层安全性(TLS)及其前身安全套接字层(SSL)是广泛使用的协议,旨在通过身份验证,加密和完整性来保护客户端和服务器之间的数据传输安全. 与常见假设相反,TLS ...
- Android : 关于HTTPS、TLS/SSL认证以及客户端证书导入方法
一.HTTPS 简介 HTTPS 全称 HTTP over TLS/SSL(TLS就是SSL的新版本3.1).TLS/SSL是在传输层上层的协议,应用层的下层,作为一个安全层而存在,翻译过来一般叫做传 ...
- python3.7.2 pip 出现locations that require TLS/SSL异常处理方法
centos7安装python3.7.2后,运行 pip3 install tornado 会报错 [root@localhost ~]# pip3 install tornado pip is co ...
- TLS协议工作过程;如何应用TLS/SSL协议为WEB流量提供安全
SSL/TLS协议的基本过程是这样的: 客户端向服务器端索要并验证公钥. 双方协商生成"对话密钥". 双方采用"对话密钥"进行加密通信. 上面过程的前两 ...
- php实现https(tls/ssl)双向认证
php实现https(tls/ssl)双向认证 通常情况下,在部署https的时候,是基于ssl单向认证的,也就是说只要客户端认证服务器,而服务器不需要认证客户端. 但在一些安全性较高的场景,如银行, ...
- Secure gRPC with TLS/SSL
摘自:http://bbengfort.github.io/programmer/2017/03/03/secure-grpc.html Secure gRPC with TLS/SSL 03 Mar ...
- TLS/SSL简单过程
.wcf的认证分为两种 1.1 transport模式,在传输层完成认证(只能在传输层完成认证,利用硬件加速效率更高) a.在使用transport模式,非windows凭证的情况下默认使用TLS/S ...
随机推荐
- 2023年最新sentinel-dashbord部署安装(保姆级别)
目录 Sentinel-dashboard安装下载 前景提要 一. 构建环境 二.下载安装与配置 1.进入百度搜索:Sentinel 或访问地址:面向云原生微服务的高可用流控防护组件 2.进入git主 ...
- Mysql 5.7 的安装
Mysql的安装 1 windows两种安装方式,入门选手推荐第二种(win10演示) Mysql官网下载地址:https://dev.mysql.com/downloads/mysql/ 2 开始准 ...
- 好的,以下是我为您拟定的自然语言处理(NLP)领域的100篇热门博客文章标题,以逻辑清晰、结构紧凑、简单易懂的
目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 1. 机器翻译 2. 文本分类 3. 情感分析 5. 优化与改进 6. 结论与展望 好的,以下是我为您拟定的 ...
- Linux系统运维之Web服务器Nginx安装
一.介绍 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.本文先整理web服务器内容. 二.环境及软件版本 操作 ...
- 一文读懂什么是AIGC?
目录 AIGC概念 AIGC发展历史 在早期萌芽阶段(1950s~1990s) 在沉淀累积阶段(1990s~2010s) 在快速发展阶段(2010s~至今) ChatGPT AIGC能做什么? 电子商 ...
- PHP代码获取网址参数的数据,请收藏。
<? echo $_SERVER['HTTP_HOST']."<br>"; #localhost echo $_SERVER['PHP_SELF']." ...
- BLOB-CLOB 处理成String (*)
实体类中的写法: --实体类对应的类型为byte[] (clob为char[]). /* byte[] blob = commonService.getPersonImage(bean.getIdCa ...
- Android 自定义view中根据状态修改drawable图片
原文地址:Android 自定义view中根据状态修改drawable图片 - Stars-One的杂货小窝 本文涉及知识点: Android里的selector图片使用 底部导航栏的使用 自定义vi ...
- 【Kubernetes】yaml文件编写 -- 持续更新
K8S通过yaml格式的声明式API与资源对象交互 API版本由apiVersion字段指定,API对象类型由kind字段指定 除此之外,每个API对象有三大类属性: metadata:元数据 spe ...
- python:map函数
参考示例 def test(x): return x * 2 mylist = [1, 2, 3, 4, 5] result = list(map(test, mylist)) print(resul ...