一、安全套接层 SSL - Secure Socket Layer [WiKi]
SSL 是一种安全协议,用于加密两端之间的通信协议。在不使用加密算法时,我们的信息会通过明文进行传播,这样我们会带来以下几个风险:
- 窃听风险:第三方可以获取通信内容
- 篡改风险:第三方可以修改通信内容
- 冒充风险:第三方可以冒充他人身份参与通信
SSL 的设计将达到下面三个效果:
- 防窃听:所有信息都是通过加密传播
- 防篡改:通信信息具有校验机制,一旦被篡改,通信双方立刻会发现
- 防冒充:通过数字证书进行身份验证
√ 那么我们先来讲一下通信中用到防窃听的加密算法:对称加密、非对称加密
symmetric key algorithms (对称加密算法)
~~ 加密和解密所使用的密钥是相同的,密钥需要做好保密,不能对外公开
asymmetric key algorithms (非对称加密算法)
~~ 加密和解密所使用的密钥是不相同的,使用公钥/私钥进行加/解密就是非对称加密算法
具体加密算法实现不在这里探讨,我们着重讲 非对称加密 的公私钥体系
二、公钥密码体系 - Public-key Cryptography
由三部分组成:「 公钥、私钥、加密解密算法 」
我们所说的公钥、私钥在生成的时候是成对出现的,它们均为是密钥,一般就是一个字符串或者数字,在加密或解密时传递给加密解密算法。加密、解密的大致流程如下:
加密 —— 公钥+加密算法对内容进行加密,得到密文
解密 —— 私钥+解密算法对密文进行解密,得到明文
这里需要讲一下,私钥也是可以加密的,公钥也可以解密。前提是私钥加密只能用公钥解,公钥加密只能用私钥解,具有唯一性
常见的公钥密码体制 RSA
- 一种公钥密码体制,公钥公开、私钥保密,并且加解密算法是公开的; 公钥、私钥 都可以用来加/解密
- 由公钥加密的内容有且只能由私钥进行解密
- 由私钥加密的内容有且只能由公钥进行解密
√ 在我们 SSL 认证中,公钥和算法都是公开的,私钥是保密的(不得泄露)。在一开始生成公私钥对,然后把公钥发布出去供别人使用,自己保留私钥
三、SSL 中的对称/非对称加密
√ 我们可不可以只使用公/私钥对(非对称加密)来进行通信,确保安全性?
我们来假设一个场景:
- C 向 S 发起请求(C 通过公钥加密、S 进行私钥解密)
- S 响应 C (S 进行私钥加密、C 通过公钥解密)
√ 但是我们不会这么做,为什么呢?
因为利用公钥加密,只能用私钥解密,私钥只能由一方保存,不得泄露,我们能确认对方的身份。如果是私钥加密,公钥解密的情况,由于公钥是公开的,无法验证接收方身份
按照前面的说法,你可能会说当用户浏览 Web 网页时,我们无需验证 C 端的身份,所以可以使用私钥加密。之后 C 发送消息,也使用公钥加密,然后 S 私钥解密就可以了
√ 但是这里还存在另外一个安全问题,由于公钥是公开的,也就是说,第三方也可以查看服务端发送的消息,如何保证我发出的信息,只能由同一身份的人识别?(冒充风险)
在这里我们可以通过协商对称加密算法来解决,具体流程如下:
- 通过协商对称加密算法,然后 C 将加密算法的密钥通过公钥加密发送给 S(第三方没有私钥无法解密)
- 向 S 发送信息请求,并使用对称加密算法进行密钥加密,S 通过之前协商的密钥进行解密
- S 解密后响应 C 请求,消息也是通过对称算法进行密钥加密,然后返回
到此为止,我们已经确保了通信中的安全,但是此时还有一个大前提没有解决
√ 就是 C 如何获取到 S 提供的非对称加密公钥?
因为所有人都可以创建公私钥对、第三方可以冒充 S(冒充风险),然后将自己的公钥发给 C。答案是通过数字证书,以数字证书作为载体将公钥发送给 C,因为数字证书可以验证身份,所以能够确保数字证书是由服务器发送过来的
√ 那么什么是数字证书?
三、数字证书 - Digital Certificate / Public Key Certificate
从机构签发的证书,作为网络通信中标识各方身份信息的数字认证。证书上面写有身份标识,当我们验证证书是可信任的时候,我们就能确认对方的身份是真实的
数字证书里面有什么内容? 证书基本内容 + 数字签名
----------------------------- BEGIN -----------------------------
证书发行者
证书的有效期
公钥
证书所有者
签名所使用的算法
指纹及指纹算法
数字签名
----------------------------- END -----------------------------
Issuer (证书发行者)
~~ 签发机构的名称
Vaild from, Valid to (证书的有效期)
~~ 证书的有效时间,过了有效期限,证书就会失效
Public key (公钥)
~~ 用于对消息进行加密
Subject (主题)
~~ 证书颁发给谁,证书的所有者,一般是某个人或者某个公司的名称、机构名称、公司网站的网址等等的
Signature algorithm (签名所使用的算法)
~~ 指该数字证书的数字签名所使用的加密算法,算法(例如 RSA 算法)对指纹进行加/解密,指纹的加密结果就是数字签名
Thumbprint, Thumbprint algorithm (指纹以及指纹算法)
~~ 指纹类指 hash 值,指纹算法类指 hash 算法,用于数字签名
√ 那么我们如何验证证书是可信任的?
√ 讲校验数字证书之前,我们先补充一下几个概念: 数字签名、数字摘要、CA 机构、CSR
数字摘要
~~ 将任意长度消息变成固定长度短消息(这个转换算法包括 Hash 算法),在这里我们将证书内容变成固定长度的短消息
数字签名
~~ 数字证书包括证书内容和数字签名,数字签名作为证书内容的校验信息,和证书内容一起发出去,可以校验发布信息没有被篡改过(防篡改风险)
证书授权中心 CA - Certificate Authority
~~ 负责发放和管理数字证书的权威机构,作为受信任人的第三方,承担公钥体系中公钥的合法性检验的责任
证书请求文件 CSR - Certificate Signing Request
~~ 公钥证书原始文件,包含了您的服务器信息和您的单位信息;证书申请者在申请数字证书时由 CSP(加密服务提供者) 在生成私钥的同时也生成证书请求文件,证书申请者只要把 CSR 文件提交给证书颁发机构后,证书颁发机构使用其根证书私钥签名就生成了证书公钥文件,也就是颁发给用户的证书
首先,我们先看一下数字签名是如何生成的,以及证书的生成过程
- 生成含有公司信息的 CSR 文件
- CSR 提交给证书颁发机构后,通过机构根证书私钥(这里使用了公钥密码体系)进行签名👇:
[1] 证书内容通过证书中声明的指纹算法生成数字摘要
[2] 数字摘要通过机构的私钥进行加密生成数字签名 - 数字签名最后和证书内容一起合成数字证书颁发给证书所有者
因为数字签名是通过受信任机构(这里的受信任机构有可能是 CA 机构也有可能是中介机构,什么是中介结构,中介机构作为中间媒介,受 CA 机构信任,所以我们只要受中介结构认证,说明我们也受 CA 机构认证,详细见【证书信任链】)私钥进行加密,也就是说如果我们验证数字签名无误,即证书内容没有被修改过,说明该证书可信
√ 如何校验数字签名?
- 将"数字签名"通过证书上声明的"签名所使用的算法"进行公钥解密获得"数字摘要"
- 将"证书内容"通过证书上面声明的"指纹算法"转换成"数字摘要"
- 将 1 中的"数字摘要"和 2 中的"数字摘要",做对比,如果一致,说明证书可信
最后我们验证一下证书是否过期、服务器证书上的域名是否和服务器的实际域名相匹配等等基本信息校验,就可以使用该数字证书
四、HTTPS 中的数字证书
一般我们使用浏览器浏览 HTTPS 网页时,也会走数字证书校验流程,由于我们的电脑或手机中都有一批 CA 受信任机构的根证书,只要通过校验我们就可以正常浏览网页
√ 但有时候,会提示证书无法受信任,询问是否继续访问?
那是由于 HTTPS 包含 SSL 认证,服务器发给我们的数字证书无法受权威机构验证。有可能该数字证书属于自签名证书,由于自签名证书谁都可以生成,也就是说可以被防冒和伪造。如果我们选择信任,很有可能会受到钓鱼网站的安全攻击
√ 那么什么是自签名证书?
五、自签名证书
利用自己的私钥给自己签名,生成根证书。不受权威机构信任,但是可以用于企业内部使用
√ 那么一般什么情况下会用到呢?
一般内部企业使用时会用到,比如说我们可以使用自签名证书,自己可以作为 CA 机构,然后将根证书保存到客户端,然后通过根证书签名服务端证书,当服务器向客户端发送服务端证书时,客户端可以通过根证书进行校验
生成自签名 CA 证书
- 生成证书私钥
- 通过证书私钥,生成 CSR
- CSR 自签名生成 CA 证书 crt
生成服务端、客户端证书
- 生成证书私钥
- 通过证书私钥生成 CSR
- CSR 进行 CA 签名生成证书 crt,其中包括证书信息、公钥及签名等
👆我们讲了如何通过数字签名进行防篡改、如何通过数字证书进行身份校验、如何通过对称/非对称算法进行数据加密,👇我们来梳理一下 SSL 的具体流程
六、SSL 具体流程
看流程之前,先讲一下 单向认证、双向认证
单向认证
~~前面我们讨论的数字证书的校验是,服务端向客户端发送数字证书,客户端通过校验确认服务端的身份,这种属于单向认证。一般在 Web 浏览器均使用单向认证,因为针对用户广泛,不需要做用户身份认证
双向认证
~~双向认证即加上一步,客户端向服务端发送数字证书,服务端通过校验确认客户端的身份。企业内部应用对接,需要对客户端进行身份认证,可以使用双向认证。
👇是 SSL 的双向认证,流程图下面有标明区分 单向认证 和 双向认证 的步骤
- C 发起招呼
- S 发送数字证书,C 进行校验
- C 发送数字证书,S 进行校验(如果是单向认证,此步骤省略)
- C 提供支持对称加密的方案,供 S 选择
- S 选择一种加密方案(使用 C 数字证书中的公钥加密, 如果是单向认证,则不加密)
- C 发送作为对称加密的密钥(使用 S 数字证书中公钥加密)
- C 通过对称密钥加密,发送个人信息请求
- S 响应个人信息请求,以对称密钥加密形式返回
七、其他补充
1) 证书信任链
因为全球受信任的权威机构也只有几家,并且直接在 CA 机构申请证书需要高额费用,所以一般我们会通过中介机构申请证书,如果中介机构的私钥一旦泄露,可以直接吊销该证书,该证书链下的所有证书也将失效
End-entity Certificate (终端实体证书)
- 拥有名称
- 公钥
- 发布者名称
- 发布者数字签名
Intermediate Certificate (中介证书)
- 拥有名称
- 公钥
- 发布者名称
- 发布者数字签名
Root Certificate (根证书)
- 根 CA 名称
- 根 CA 公钥
- 根 CA 数字签名
所以一般校验过程是:
a. 终端证书信任中介证书
b. 中介证书信任根证书
c. 所以终端证书受信任
2) 证书格式
根据不同的服务器,和不同的服务器版本,我们会选择不同的证书格式
证书后缀 | 格式 | 支持私钥 | 密码保护 |
---|---|---|---|
.der | 二进制 | 不 | 无 |
.cer | 二进制/文本 | 不 | 无 |
.pem(.pem/.crt/.cer/.key) | 文本 | 可 | 无 |
.crt | 二进制/文本 | 不 | 无 |
.pfx | 二进制 | 有 | 有 |
.p12 | 二进制 | 有 | 有 |
.jks | 二进制 | 有 | 无 |
网友评论