首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >理解证书验证系列——HTTPS

理解证书验证系列——HTTPS

作者头像
mingjie
发布于 2022-05-12 10:21:49
发布于 2022-05-12 10:21:49
1.4K0
举报

1 加密方式

方法1 对称加密

这种方式加密和解密同用一个密钥。加密和解密都会用到密钥。没有密钥就无法对密码解密,反过来说,任何人只要持有密钥就能解密了。

以对称加密方式加密时必须将密钥也发给对方。可究竟怎样才能安全地转交?在互联网上转发密钥时,如果通信被监听那么密钥就可会落人攻击者之手,同时也就失去了加密的意义。另外还得设法安全地保管接收到的密钥。

方法2 非对称加密

公开密钥加密使用一对非对称的密钥。一把叫做私有密钥,另一把叫做公开密钥。顾名思义,私有密钥不能让其他任何人知道,而公开密钥则可以随意发布,任何人都可以获得。

使用公开密钥加密方式,发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。利用这种方式,不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听而盗走。

非对称加密的特点是信息传输一对多,服务器只需要维持一个私钥就能够和多个客户端进行加密通信。

这种方式有以下缺点:

  • 公钥是公开的,所以针对私钥加密的信息,黑客截获后可以使用公钥进行解密,获取其中的内容;
  • 公钥并不包含服务器的信息,使用非对称加密算法无法确保服务器身份的合法性,存在中间人攻击的风险,服务器发送给客户端的公钥可能在传送过程中被中间人截获并篡改;
  • 使用非对称加密在数据加密解密过程需要消耗一定时间,降低了数据传输效率;

方法3.对称加密+非对称加密(HTTPS采用这种方式)

使用对称密钥的好处是解密的效率比较快,使用非对称密钥的好处是可以使得传输的内容不能被破解,因为就算你拦截到了数据,但是没有对应的私钥,也是不能破解内容的。就比如说你抢到了一个保险柜,但是没有保险柜的钥匙也不能打开保险柜。那我们就将对称加密与非对称加密结合起来,充分利用两者各自的优势:

在交换密钥环节使用非对称加密方式,之后的建立通信交换报文阶段则使用对称加密方式。

具体做法是:发送密文的一方使用对方的公钥进行加密处理“对称的密钥”,然后对方用自己的私钥解密拿到“对称的密钥”,这样可以确保交换的密钥是安全的前提下,使用对称加密方式进行通信。所以,HTTPS采用对称加密和非对称加密两者并用的混合加密机制。

2 数字签名

解决数据无法被解密,但可能被篡改的问题

  • 能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名。
  • 数字签名能确定消息的完整性,证明数据是否未被篡改过。

生成

将一段文本先用Hash函数生成消息摘要,然后用发送者的私钥加密生成数字签名,与原文文一起传送给接收者。接下来就是接收者校验数字签名的流程了。

代码语言:javascript
复制
                        -------                   --------
A 发送的信息 ---hash---> |消息摘要| --- 私钥加密 ---> |数字签名| -----> B 接
                        -------                   --------
A 发送的信息 -----------------------------------------------------> B 收

校验

接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与上一步得到的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。

代码语言:javascript
复制
                           -------             
B |数字签名| ---公钥解密---> |消息摘要| --- 对比 -----> 相同 = 未篡改
                           -------            
B 收到的信息 -----hash-----> 消息摘要 ------^

假设消息传递在A,B两人之间发生。

  1. B将消息连同数字签名一起发送给A
  2. A接收到消息后,通过校验数字签名,就可以验证接收到的消息就是B发送的。

当然,这个过程的前提是A知道B的公钥。问题的关键的是,和消息本身一样,公钥不能在不安全的网络中直接发送给B,或者说拿到的公钥如何证明是A的。

此时就需要引入了证书颁发机构(Certificate Authority,简称CA),CA数量并不多,Kobe客户端内置了所有受信任CA的证书。CA对James的公钥(和其他信息)数字签名后生成证书。

A需要从一个可信的地方拿到B的公钥 —— 第三方CA机构

第三方CA机构

  • 服务器的运营人员向第三方机构CA提交公钥、组织信息、个人信息(域名)等信息并申请认证;
  • CA通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等;
  • 如信息审核通过,CA会向申请者签发证书。证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA的信息、有效时间、证书序列号等信息的明文,同时包含一个签名。 其中签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用 CA的私钥对信息摘要进行加密,密文即签名;
  • 客户端 Client 向服务器 Server 发出请求时,Server 返回证书文件;
  • 客户端 Client 读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应 CA的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即服务器的公开密钥是值得信赖的。
  • 客户端还会验证证书相关的域名信息、有效时间等信息; 客户端会内置信任CA的证书信息(包含公钥),如果CA不被信任,则找不到对应 CA的证书,证书也会被判定非法。

3 HTTPS流程

  1. Client发起一个HTTPS(比如https://xxx.com)的请求,根据RFC2818的规定,Client知道需要连接Server的443(默认)端口。
  2. Server把事先配置好的公钥证书(public key certificate)返回给客户端。
  3. (非对称)Client验证公钥证书:比如是否在有效期内,证书的用途是不是匹配Client请求的站点,是不是在CRL吊销列表里面,它的上一级证书是否有效,这是一个递归的过程,直到验证到根证书(操作系统内置的Root证书或者Client内置的Root证书)。如果验证通过则继续,不通过则显示警告信息。 Client拿公钥:用证书的公钥解密证书签名,解密出来的是证书摘要明文,和证书摘要对比,相同说明公钥正确
  4. (非对称)Client使用伪随机数生成器生成加密所使用的对称密钥,然后用证书的公钥加密这个对称密钥,发给Server。生成密码,用公钥加密发给Server
  5. (非对称)Server使用自己的私钥(private key)解密这个消息,得到对称密钥。至此,Client和Server双方都持有了相同的对称密钥。Server用私钥解密,拿到密码
  6. (对称)Server使用对称密钥加密“明文内容A”,发送给Client。
  7. (对称)Client使用对称密钥解密响应的密文,得到“明文内容A”。
  8. (对称)Client再次发起HTTPS的请求,使用对称密钥加密请求的“明文内容B”,然后Server使用对称密钥解密密文,得到“明文内容B”。

(整理自https://juejin.im/post/5ca6a109e51d4544e27e3048)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 1 加密方式
    • 方法1 对称加密
    • 方法2 非对称加密
    • 方法3.对称加密+非对称加密(HTTPS采用这种方式)
  • 2 数字签名
    • 生成
    • 校验
    • 第三方CA机构
  • 3 HTTPS流程
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档