likes
comments
collection
share

https基础 - 关于签名证书CA的那些事

作者站长头像
站长
· 阅读数 18

“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第2篇文章,点击查看活动详情

前言

  • 本篇属于理论知识篇,适合于所有人进行学习。
  • 本篇属于基础入门,如果您是大神,可以快速划过。
  • 本篇的内润循序渐进,跳跃可能会影响阅读体验。
  • 相信你看完本篇,会有一些不一样的认识。

话不多说; So,let's start tossing!

本文总字数2510字,预计阅读需要花费9分钟。

背景

在搭建https的环境中,经常会看到一些名词,例如签名、认证、密钥、证书这类的名词,一时半会儿晕头转向,好像知道它在说些什么,但是又好像什么也不知道。

这些盲区好像拦路石一样,阻碍我们前进的步伐,如果你也跟博主一样有这样的困惑,那么就跟着步伐,一起去探索网络世界的奥妙吧!

知识储备

CIA Triad/信息安全三要素

  • 保密性(Confidentiality):信息在传输时不被泄露
  • 完整性(Integrity):信息在传输时不被篡改
  • 有效性(Availability):信息的使用者是合法的

我们在研究一项技术的时候(例如:签名),设法把它带入到这个CIA的模型中,就会更好的理解这项技术的设计初衷。

消息需要保密安全,那怎么实现呢?当然是加密和解密了。毕竟一切关于安全的问题,本质上都是加密和解密的事情。拆分下来就是:

  1. 如何加密如何解密(加密算法)
  2. 谁来加密和谁来解密(有效性)
  3. 怎么保证解密后的是加密前的(完整性)
  4. ......

一切安全的基础 - 加密算法

常见的加密算法,根据其算法的特征,主要分为两类:对称加密和非对称加密。

对称加密

对称加密 = 单钥加密 = 单密钥加密

算法特征

  1. 加密方和解密方使用同一个密钥
  2. 加密解密的速度比较快,适合数据比较长时的使用,也适合消息发送方有大量数据需要加密的场景
  3. 密钥传输的过程不安全,且容易被破解,密钥管理也比较麻烦,密钥丢失后会造成很大的麻烦

非对称加密

非对称加密 = 双钥加密 = 公私钥

算法特征

  1. 公钥和私钥总是成对出现的
  2. 公钥可以解开用私钥的加密的消息,反之也成立
  3. 公钥/私钥不能通过自己来解密自己加密过的消息(私钥本身持有公钥)
  4. 公钥和私钥是成对的,并没有明确的定义,你选择公开哪个,哪个就是公钥
  5. 公钥和私钥无法互相推出,(私钥无法导出公钥,之所以“可以”,是因为私钥文件里面顺便保存了公钥信息)

DES/AES/RSA

DES和AES是常见的对称加密的算法

RSA是经典的非对称加密算法

非对称加密的应用

由于非对称加密的特性,导致其在安全的领域内大放异彩。

其最主要的特性就是其私钥只有一份,其他任何人都不能获取到,拥有这个私钥,就可以成为其身份的象征,其他任何人都无法冒充。利用这个独特的性质,就可以产生一些奇妙的应用,例如下面的两个方面:

加密通信

由于通信的特征,导致非对称加密在通信领域中的实现原理较为简单,如下。

提示一下,这是一个思想实验,如果您看起来比较绕的话,建议您拿着纸笔画一画。

我们假设有A和B两个角色,需要进行通信,其中消息的流向是 A --> B,我们来模拟一下非对称加密算法在加密通信中的应用。

Step 1: 准备阶段
B生成来一个密钥对,其中公钥为x,私钥为y。
A持有B的公钥x。

Step 2:消息加密阶段
A利用公钥x对消息m进行加密,生成来加密消息m‘

即:x + m = m’

Step 3:消息解密阶段
B利用私钥y对消息m‘进行解密
即: y + m' = m

Step 4:其他人C尝试解密
由于C持有公钥x,m'是有x加密而来,不能再次使用x进行解密,所以这个消息C是无法破解的。
即:x + m‘ ≠ m

这样就完成了一次单向通信中的加密过程。 这个特性利用了只有一方持有私钥,那么发送方将消息利用持有方的公钥进行加密,就确定了这个消息的两个方面:

  • 这个消息明确了接收方,其他任何人都无法接收到这一条消息
  • 这个消息是具有保密性的,因为除了持有私钥的那一方,其他任何角色都无法对消息进行解密。

总结下来就是:利用公钥加密,私钥解密,就可以实现加密通信。

数字签名

或许你在想,那么我使用私钥加密,使用公钥进行解密,这样会有什么使用场景吗?

我们可以想一下,非对称加密的特征,在想一想场景,是不是有一些眉目了呢!

无论如何,是消息的发送方进行加密,消息的接收方进行解密,私钥唯一,而公钥不唯一。

让我们带入到加密通信的章节里进行对比分析:

公钥加密,私钥解密私钥加密,公钥解密
发送方能唯一确定接收方能唯一确定发送方
接收方只有接收方能解密,消息的保密性得到保证任何人都能解密,保密性不行

那么有什么场景下是适用这种模式呢?

也可以换一个问法,那种类型的消息能确定来源,而且任何人都能读到,对公众开放?

那么就是元信息

在互联网的场景下,这个元信息随着消息一起发送,接收方对元消息进行解密,校验。

我们称这个元消息为数字签名

具体数字签名是怎么设计的呢?

为了理解清晰,以下忽略了加密通信的过程,实际上通信过程中使用了双向加密,即A,B双方各持有对方的公钥,消息传递过程中也会重复加密通信的流程。

假设 A --> B,消息为m的场景:

Step 1:签名阶段
A:
`m`  -hash函数处理-> `m‘(摘要)`
`m‘(摘要)`-A的私钥->` m''(签名)`


Step 2: 传输阶段
传输过程中传输两部分
分别是原消息`m``m‘’(签名)`


Step 3: 验证阶段
B:
` m''(签名)` -A的公钥-> `m‘(摘要)`
`m`  -hash函数处理-> `m‘(摘要)`

如果两步骤的m‘(摘要)是相同的,则说明

  1. 消息是完整的,因为两次hash后得到的结果是相同的
  2. 消息是A发送的,因为只有A的公钥才能解密 m''(签名)

所以,数字签名解决了CIP中的I(完整性)和P(有效性)。

加密通信配合数字证书就可以解决大部分的安全问题。

问题

什么是单向认证,什么是双向认证

在通信领域中,有可能B只需要接受消息,而不用主动的发送消息,那么这个过程就是单向认证。

角色B自身不生成密钥对,持有其他角色的公钥,从而被动的接受其他角色发来的消息,这种流程就是单向认证。

如果B也需要发送消息,那么B也需要生成密钥对,持有自己的私钥,而把公钥广播出去。这种的通信就是双向认证。

什么是数字签名,为什么需要数字签名

数字签名本质上就是 消息体m hash处理成为摘要,然后将摘要使用消息发送发的私钥进行加密后的产物。

主要是为了解决消息的完整性和有效性的校验,代表了这个消息是由A发出,具有可信度。

为什么说公钥加密,私钥签名

公钥加密是为了加密通信,解决了CIA模型中的保密性;

私钥签名是为了确定消息的完整性和有效性。

什么是数字证书,为什么需要数字证书

数字证书简称CA,它由权威机构给某网站颁发的一种认可凭证。

数字证书的颁发流程

有一个顶级机构root,它有自己的公钥和私钥。

Step 1: 申请阶段
AA的公钥 + A的一些信息(例如域名) 发送给 root

Step 2: 颁发阶段
rootA的公钥 + A的一些信息(例如域名) +   -root的私钥-> 中间体 + 签名 = A的证书

数字证书的使用流程

Step 1: A,B的通信阶段
A 消息m + 签名m‘ + 数字证书ca 发送给 B


Step 2: B的验证阶段
A证书ca = root的签名 + 证书内容
root的签名 + root的公钥 --> 验证证书的有效性和完整性
root的签名 + 证书内容 --> A的公钥 + A的一些信息(例如域名)
对A的消息进行比对(例如域名)
这个就完成了数字证书的整个流程。

为什么需要数字证书

中间人攻击:

在加密通信和数字签名的过程中,很有可能存在中间人攻击的状况,具体的就是 A <-> B <-> C这样的通信链路, A的消息先发送给B,B在发送给C,反过来也是一样, A和C都不知道对方的存在,他们都只知道B的存在。

B在建立连接的时候对连接进行拦截,形成了中间人攻击。 B就会看到所有的消息。所以需要数字证书对通信的对方进行置信。 后续详细会有文章详细的介绍一下中间人攻击。

参考

  1. 数字签名是什么?
  2. 密码学笔记
  3. 深入浅出 - 公钥、私钥和数字签名最通俗的理解
  4. SSL中,公钥、私钥、证书的后缀名都是些啥?
  5. 对称加密和非对称加密、公钥和私钥、单向认证和双向认证、数字签名、数字证书、根证书