HTTPS与CA认证
1. HTTP 协议
在谈论 HTTPS 协议之前,先来回顾一下 HTTP 协议的概念。
1.1 HTTP 协议介绍
HTTP 协议是一种基于文本的传输协议,它位于 OSI 网络模型中的应用层
。
HTTP 协议是通过客户端和服务器的请求应答来进行通讯,目前协议由之前的 RFC 2616 拆分成立六个单独的协议说明(RFC 7230、RFC 7231、RFC 7232、RFC 7233、RFC 7234、RFC 7235),通讯报文如下:
- 请求
POST http://www.baidu.com HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Content-Length: 7
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36wd=HTTP
- 响应
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Thu, 14 Feb 2019 07:23:49 GMT
Transfer-Encoding: chunked<html>...</html>
<!--more-->
1.2 HTTP 中间人攻击
HTTP 协议使用起来确实非常的方便,但是它存在一个致命的缺点:不安全
。
我们知道 HTTP 协议中的报文都是以明文的方式进行传输,不做任何加密,这样会导致什么问题呢?下面来举个例子:
- 小明在 JAVA 贴吧发帖,内容为
我爱JAVA
:
- 被中间人进行攻击,内容修改为
我爱PHP
- 小明被群嘲(手动狗头)
可以看到在 HTTP 传输过程中,中间人能看到并且修改 HTTP 通讯中所有的请求和响应内容,所以使用 HTTP 是非常的不安全的。
1.3 防止中间人攻击
这个时候可能就有人想到了,既然内容是明文那我使用对称加密
的方式将报文加密这样中间人不就看不到明文了吗,于是如下改造:
- 双方约定加密方式
- 使用 AES 加密报文
这样看似中间人获取不到明文信息了,但其实在通讯过程中还是会以明文的方式暴露加密方式和秘钥,如果第一次通信被拦截到了,那么秘钥就会泄露给中间人,中间人仍然可以解密后续的通信:
那么对于这种情况,我们肯定就会考虑能不能将秘钥进行加密不让中间人看到呢?答案是有的,采用非对称加密
,我们可以通过 RSA 算法来实现。
在约定加密方式的时候由服务器生成一对公私钥
,服务器将公钥
返回给客户端,客户端本地生成一串秘钥(AES_KEY
)用于对称加密
,并通过服务器发送的公钥
进行加密得到(AES_KEY_SECRET
),之后返回给服务端,服务端通过私钥
将客户端发送的AES_KEY_SECRET
进行解密得到AEK_KEY
,最后客户端和服务器通过AEK_KEY
进行报文的加密通讯,改造如下:
可以看到这种情况下中间人是窃取不到用于AES加密
的秘钥,所以对于后续的通讯是肯定无法进行解密了,那么这样做就是绝对安全了吗?
所谓道高一尺魔高一丈,中间人为了对应这种加密方法又想出了一个新的破解方案,既然拿不到AES_KEY
,那我就把自己模拟成一个客户端和服务器端的结合体,在用户->中间人
的过程中中间人模拟服务器的行为,这样可以拿到用户请求的明文,在中间人->服务器
的过程中中间人模拟客户端行为,这样可以拿到服务器响应的明文,以此来进行中间人攻击:
这一次通信再次被中间人截获,中间人自己也伪造了一对公私钥,并将公钥发送给用户以此来窃取客户端生成的AES_KEY
,在拿到AES_KEY
之后就能轻松的进行解密了。
中间人这样为所欲为,就没有办法制裁下吗,当然有啊,接下来我们看看 HTTPS 是怎么解决通讯安全问题的。
2. HTTPS 协议
2.1 HTTPS 简介
HTTPS 其实是SSL+HTTP
的简称,当然现在SSL
基本已经被TLS
取代了,不过接下来我们还是统一以SSL
作为简称,SSL
协议其实不止是应用在HTTP
协议上,还在应用在各种应用层协议上,例如:FTP
、WebSocket
。
其实SSL
协议大致就和上一节非对称加密
的性质一样,握手的过程中主要也是为了交换秘钥,然后再通讯过程中使用对称加密
进行通讯,大概流程如下:
这里我只是画了个示意图,其实真正的 SSL 握手会比这个复杂的多,但是性质还是差不多,而且我们这里需要关注的重点在于 HTTPS 是如何防止中间人攻击的。
通过上图可以观察到,服务器是通过 SSL 证书来传递公钥
,客户端会对 SSL 证书进行验证,其中证书认证体系就是确保SSL
安全的关键,接下来我们就来讲解下CA 认证体系
,看看它是如何防止中间人攻击的。
证书认证的流程大致如下:
1、Bob 去可信任的认证机构证实本人真实身份,并提供自己的公钥。
2、Alice 想跟 Bob 通信,首先向认证机构请求 Bob 的公钥,认证机构会把一张证书(Bob 的公钥以及机构对其公钥的签名)发送给 Alice。
3、Alice 检查签名,确定该公钥确实由这家认证机构发送,中途未被篡改。
4、Alice 通过这个公钥加密数据,开始和 Bob 通信。
2.2 CA 认证体系
数字证书
在学习CA认证之前,需要学习一下数字证书的相关概念,下面这篇文章通俗易懂
数字证书及CA的扫盲介绍 https://www.cnblogs.com/liyulong1982/p/6106132.html
证书体系的相关知识比较枯燥、晦涩,下面举通俗的例子来说。
◇ 普通的介绍信
想必大伙儿都听说过介绍信的例子吧?假设 A 公司的张三先生要到 B 公司去拜访,但是 B 公司的所有人都不认识他,他咋办捏?常用的办法是带公司开的一张介绍信,在信中说:兹有张三先生前往贵公司办理业务,请给予接洽......云云。然后在信上敲上A公司的公章。
张三先生到了 B 公司后,把介绍信递给 B 公司的前台李四小姐。李小姐一看介绍信上有 A 公司的公章,而且 A 公司是经常和 B 公司有业务往来的,这位李小姐就相信张先生不是歹人了。
说到这,爱抬杠的同学会问了:万一公章是伪造的,咋办捏?在此,俺要先声明,在本例子中,先假设公章是难以伪造的,否则俺的故事没法说下去鸟。
◇ 引入中介机构的介绍信
好,回到刚才的话题。如果和 B 公司有业务往来的公司很多,每个公司的公章都不同,那前台就要懂得分辨各种公章,非常滴麻烦。所以,有某个中介公司 C,发现了这个商机。C公司专门开设了一项“代理公章”的业务。
今后,A 公司的业务员去 B 公司,需要带2个介绍信:
介绍信1
含有 C 公司的公章及 A 公司的公章。并且特地注明:C 公司信任 A 公司。
介绍信2
仅含有 A 公司的公章,然后写上:兹有张三先生前往贵公司办理业务,请给予接洽......云云。
某些不开窍的同学会问了,这样不是增加麻烦了吗?有啥好处捏?
主要的好处在于,对于接待公司的前台,就不需要记住各个公司的公章分别是啥样子的;他/她只要记住中介公司 C 的公章即可。当他/她拿到两份介绍信之后,先对介绍信1的 C 公章,验明正身;确认无误之后,再比对介绍信1和介绍信2的两个 A 公章是否一致。如果是一样的,那就可以证明介绍信2是可以信任的了。
★ 相关专业术语的解释
费了不少口水,终于说完了一个俺自认为比较通俗的例子。如果你听到到这,还是想不明白这个例子在说啥,那后续的内容,就不必浪费时间听了 :(
下面,俺就着上述的例子,把相关的名词,作一些解释。
◇ 什么是证书?
“证书”洋文也叫“digital certificate”或“public key certificate”(专业的解释看“这里”)。
它是用来证明某某东西确实是某某东西的东西(是不是像绕口令?)。通俗地说,证书就好比例子里面的公章。通过公章,可以证明该介绍信确实是对应的公司发出的。
理论上,人人都可以找个证书工具,自己做一个证书。那如何防止坏人自己制作证书出来骗人捏?请看后续 CA 的介绍。
◇ 什么是CA?
CA是Certificate Authority的缩写,也叫“证书授权中心”。(专业的解释看“这里”)
它是负责管理和签发证书的第三方机构,就好比例子里面的中介——C 公司。一般来说,CA必须是所有行业和所有公众都信任的、认可的。因此它必须具有足够的权威性。就好比A、B两公司都必须信任C公司,才会找 C 公司作为公章的中介。
◇ 什么是CA证书?
CA 证书,顾名思义,就是CA颁发的证书。
前面已经说了,人人都可以找工具制作证书。但是你一个小破孩制作出来的证书是没啥用处的。因为你不是权威的CA机关,你自己搞的证书不具有权威性。
这就好比上述的例子里,某个坏人自己刻了一个公章,盖到介绍信上。但是别人一看,不是受信任的中介公司的公章,就不予理睬。坏蛋的阴谋就不能得逞啦。
文本后续提及的证书,若无特殊说明,均指 CA 证书。
◇ 什么是证书之间的信任关系?
在俺的例子里谈到,引入中介后,业务员要同时带两个介绍信。第一个介绍信包含了两个公章,并注明,公章C信任公章A。证书间的信任关系,就和这个类似。就是用一个证书来证明另一个证书是真实可信滴。
◇ 什么是证书信任链?
实际上,证书之间的信任关系,是可以嵌套的。比如,C 信任 A1,A1 信任 A2,A2 信任 A3......这个叫做证书的信任链。只要你信任链上的头一个证书,那后续的证书,都是可以信任滴。
◇ 什么是根证书?
“根证书”的洋文叫“root certificate”,专业的解释看“这里”。为了说清楚根证书是咋回事,再来看个稍微复杂点的例子。
假设 C 证书信任 A 和 B;然后 A 信任 A1 和 A2;B 信任 B1 和 B2。则它们之间,构成如下的一个树形关系(一个倒立的树)。
处于最顶上的树根位置的那个证书,就是“根证书”。除了根证书,其它证书都要依靠上一级的证书,来证明自己。那谁来证明“根证书”可靠捏?实际上,根证书自己证明自己是可靠滴(或者换句话说,根证书是不需要被证明滴)。
聪明的同学此刻应该意识到了:根证书是整个证书体系安全的根本。所以,如果某个证书体系中,根证书出了问题(不再可信了),那么所有被根证书所信任的其它证书,也就不再可信了。这个后果是相当相当滴严重(简直可以说是灾难性的)。
CA 认证
上一节我们看到客户端需要对服务器返回的 SSL 证书进行校验,那么客户端是如何校验服务器 SSL 证书的安全性呢。
- 权威认证机构
在 CA 认证体系中,所有的证书都是由权威机构来颁发,而权威机构的 CA 证书都是已经在操作系统中内置的,我们把这些证书称之为CA根证书
:
- 签发证书
我们的应用服务器如果想要使用 SSL 的话,需要通过权威认证机构来签发CA证书
,我们将服务器生成的公钥和站点相关信息发送给CA签发机构
,再由CA签发机构
通过服务器发送的相关信息用CA签发机构
进行加签,由此得到我们应用服务器的证书,证书会对应地生成证书内容的签名
,并将该签名
使用CA签发机构
的私钥进行加密得到证书指纹
,并且与上级证书生成关系链。这里我们把百度的证书下载下来看看:
可以看到百度是受信于
GlobalSign G2
,同样的GlobalSign G2
是受信于GlobalSign R1
,当客户端(浏览器)做证书校验时,会一级一级的向上做检查,直到最后的根证书
,如果没有问题说明服务器证书
是可以被信任的。 如何验证服务器证书
那么客户端(浏览器)又是如何对服务器证书
做校验的呢,首先会通过层级关系找到上级证书,通过上级证书里的公钥
来对服务器的证书指纹
进行解密得到签名(sign1)
,再通过签名算法算出服务器证书的签名(sign2)
,通过对比sign1
和sign2
,如果相等就说明证书是没有被篡改
也不是伪造
的。
这里有趣的是,证书校验用的 RSA 是通过私钥加密证书签名,公钥解密来巧妙的验证证书有效性。
这样通过证书的认证体系,我们就可以避免了中间人窃取AES_KEY
从而发起拦截和修改 HTTP 通讯的报文。
总结
首先先通过对 HTTP 中间人攻击的来了解到 HTTP 为什么是不安全的,然后再从安全攻防的技术演变一直到 HTTPS 的原理概括,希望能让大家对 HTTPS 有个更深刻的了解。
学习参考:
原文:为什么HTTPS是安全的 (通俗易懂 配图)https://segmentfault.com/a/1190000023936425
原文:数字证书及CA的扫盲介绍 https://www.cnblogs.com/liyulong1982/p/6106132.html
加密算法的前世今生 https://mp.weixin.qq.com/s/HvZsBiNn9tPcq11fmWgcLQ
HTTPS与CA认证相关推荐
- 软件测试ca,Apache 2.0上 HTTPS 实现CA认证, 不是HTPASSWD的那种.
yhuang95411 回复于:2004-12-19 10:53:02 libghttp-devel-1.0.9-5 httpd-devel-2.0.40-8 httpd-manual-2.0.40- ...
- CA 认证过程及 https 实现方法
CA 认证过程 CA 概述:Certificate Authority 的缩写,通常翻译成认证权威或者认证中心,主要用途是为用户发放数字证书.CA 认证的流程和公安局派出所颁发身份证的流程一样 认证中 ...
- [Linux] centos 6.5 httpd 自建CA 认证 实现 https 服务
httpd 自建CA 认证 实现 https 服务 需要的软件: httpd mod_ssl openssl 本文将CA证书服务器和 httpd服务器放到一台物理机器上实现的, 可以作为学习的参考. ...
- centos 6.5 httpd 自建CA 认证 实现 https 服务
httpd 自建CA 认证 实现 https 服务 需要的软件: httpd mod_ssl openssl 本文将CA证书服务器和 httpd服务器放到一台物理机器上实现的, 可以作为学习的参考. ...
- CA认证与HTTPs原理介绍
今天继续给大家介绍Linux运维相关知识,本文主要内容是CA认证与HTTPs原理知识. 一.https与ssl 我们在访问网站时,使用的比较常见的是https协议,https协议其实就是在http协议 ...
- Https CA认证图解
Https CA认证图解 http通信存在的问题 容易被监听 http通信都是明文,数据在客户端与服务器通信过程中,任何一点都可 能被劫持.比如,发送了银行卡号和密码,hacker劫取到数据,就能看到 ...
- kubernetes https双向认证-----ca认证
为什么写这个呢? 在没有了解k8s认证的时候干过一件蠢事,公司项目是通过bearer token进行权限认证的,当时一直在纠结这个token是哪儿来的,然后各种查询secret对比是否一样,最后找到了 ...
- CA认证-https实现
一.CA认证流程 实验环境 CA认证中心服务端 lewis63 IP:192.168.1.63 客户端 lewis64 IP:192.168.1.64 认证中心(CA)的功能有:证书发放.证书更新.证 ...
- Openssl搭建私有CA认证
概述 CA英文全称Certification Authority,即数字证书认机构.从广义上来说,CA是负责发放和管理数字证书的权威机构,并作为用户数字认证中受信任的第三方,承担公钥体系(PKI)中公 ...
最新文章
- python函数代码的复用_Python__函数和代码复用
- Effective.Java第23-33条(泛型相关)
- GDI绘制时钟效果,与系统时间保持同步,基于Winform
- MAC下代理工具Charles使用
- kubernetes (k8s)的二进制部署单节点(etcd和flannel网络)
- 计算机科学与技术毕业答辩流程,计算机科学与技术学院毕业答辩工作细则
- hibernate文档
- dbf文件mysql,dbf文件怎么打开?dbf是什么文件?
- 抖音网红mac桌宠Desktop Goose呆头鹅的使用教程
- Oracle数据库索引底层实现原理笔记
- JAVA北京时间转换为世界协调时
- 电脑连不上网—更改电脑ip
- 微信小程序-首屏视频加载
- 程序员如何创新?逆工程师思维
- SQL 语句的类型和 用法
- 亚马逊——不一样的电商公司
- Linux系统实现访问localhost(127.0.0.1)浏览WWW网站目录
- 数据结构——数据结构算法之《图》
- java类中获取tomcat下的webap路径方法
- 微信公众号平台的现状及发展前景的分析(十八)