title: HTTPS小记
date: 2016-10-24 23:58:06
tags: daily
categories: 其它
背景
最近好像跟HTTPS较上劲了,连续碰到与之相关问题。自己对HTTPS了解的并不多,今天简单了解了一下,在此做个记录。
首先有几个基本概念,TCP/IP协议,HTTP一些,对称/非对称加密,证书,公钥/私钥。
TCP/TP:
- 传输层协议,主要解决数据如何在网络中传输
HTTP:
- 应用层协议,主要解决如何包装数据,依赖TCP/IP协议
对称加密:
- 加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来
非对称加密:
- 加密和解密过程使用了不同的密钥。分为公钥和私钥,它们可以互相解密。
- 公钥加密,私钥解密
- 私钥数字签名,公钥验证
证书:
- 我理解主要是两个作用:验证证书持有者身份、提供证书持有者公钥
为什么用HTTPS
因为HTTP不安全。
- HTTP使用的是明文传输,容易被窃取
- 无法验证报文完整性,可能被篡改
- 无法验证通信双方的身份
为了对HTTP提供安全保障,就依赖:
SSL与TLS
SSL(Secure Socket Layer,安全套接字层)
TLS(Transport Layer Security,传输层安全协议)
TLS可以理解为SSL的增强版。
HTTP直接与TCP通信,而在HTTPS中首先与SSL通信,SSL再与TCP通信。我觉得可以理解成HTTPS = HTTP + SSL。
不论HTTP还是HTTPS,所有的通信、加解密都是最终都是建立在TCP/IP之上的。
加密思路
- 客户端向服务器端索要并验证公钥;
- 双方协商生成"对话密钥";
- 双方采用"对话密钥"进行加密通信;
在通信过程中其实双方使用的还是对称的加密算法,但是为了让这个对称的加密算法足够安全。首先使用非对称的算法来获取对话密钥,之后再用对话密钥来对通信的内容加密解密。
所以关键问题就变成了:
对话密钥的创建
我没有仔细阅读相关协议,在网上查了一些资料,下面的内容是根据自己的理解写的。
简单描述一次对话密钥的获取过程:
C:我想跟服务器A说悄悄话,我支持1,2,3版本的协议。我先跟你说个秘密X。
S:我是服务器A。我们用3版本的协议说话吧,我也给你说个秘密Y。我再给你个公钥,使用它加密后的信息就只有我能听懂了。
C:让我先看看你是不是服务器A。(确认是服务器A)那我再给你说个秘密Z,这次用你给我的公钥对Z加密,确保其他人都不知道。以后我们用X,Y,Z这三个秘密来验证彼此的消息。我要跟你确认的就这些。
S:好的,以后我们用X,Y,Z这三个秘密来验证彼此的消息。我要确认的也就这些内容。网上把上面四个步骤描述
网上把上述的四个步骤描述为:
- 客户端发出请求
- 支持的协议版本,比如TLS 1.0版
- 一个随机数
- 支持的加密方法,比如RSA公钥加密
- 支持的压缩方法
- 服务器回应
- 协议的版本
- 加密的算法
- 生成随机数
- 服务器证书
- 客户端回应
- 对服务器下发的证书进行验证
- 再次产生一个随机数(第三个随机数)
- 使用服务器证书中的公钥进行加密
- 发送编码改变的消息
- 发送整个前面所有消息的hash值
- 根据三个随机数生成对话密钥
- 服务器最终回应
- 使用私钥解密接收到第三个随机数
- 验证数据完整性
- 使用跟客户端同样的方式生成对话密钥
- 告知客户端已经切换到协商过的加密套件状态
- 服务端发送消息验证加解密是否成功
如果服务器需要对客户端的身份进行认证,那么在第一次服务器回应中可以向客户端索取证书。客户端提供证书后,服务器通过验证客户端证书,从而验证客户端的身份。
网友评论