总结下最近看的SSL/TLS协议流程
在讲之前,需要知道下面这几个知识点
-
RSA加密
属于非对称加密,特点是若明文信息被公钥加密成密文,则密文只能被私钥解密;若明文信息被私钥加密成密文,则密文只能被公钥解密 -
CA
你可以理解成,只要是CA信任的组织,你就信任,CA也有自己的公钥、私钥。CA的公钥是众所周知的。 -
证书和签名
证书包含有:申请者的公钥、申请者的组织信息、签名。
这里可以看出证书是包含签名的,那签名是怎么产生的呢?把申请者的公开信息用散列函数计算出一个信息摘要,然后用CA的私钥把这个信息摘要进行加密,这个密文就是签名。
如果证书内容被修改,比如证书里面的公钥,收到证书的一方计算证书的信息摘要后发现与在用CA的公钥解密证书签名后得到的信息摘要后不一致,就能判断证书被修改。
-
还有一些常用命名
1.比如server生成的私钥/公钥对,可以命名成server.key/server.pub
2.CA给server颁发的证书可以命名成server.crt
3.CA也有自己的证书,可以命名成ca.crt(里面有CA公钥) -
单向认证
通常是client来验证server的合法性,所以client就需要一个ca.crt(用来验证server.crt),server需要server.crt,server.key -
双向认证
在单向认证基础上,服务器还要验证客户端合法性
server需要server.key,server.crt,ca.crt
client 需要 client.key 、client.crt 、ca.crt
知道上面几点后就好理解了
第一步,客户端发出请求(ClientHello)
包含以下信息:
- client支持的协议ssl协议版本
- client生成一个随机数
- 支持的加密方法、压缩方法
第二步,服务端发出请求(ServerHello)
包含以下信息:
- 确认使用的ssl协议版本
- server生成一个随机数
- 确认使用的加密方法、压缩方法
- 服务器证书
如果是双向认证,这里服务端还会请求客户端的证书
第三步,客户端回应
client收到server.crt后用ca.crt来验证server的合法性,如果不合法,会显示一个警告,让访问者选择是否还要继续访问(你要继续访问也是可以的)。如果合法,client就从证书里取出server的公钥,然后:
- 生成一个随机数(注意这是client生成的第二个随机数,又称“pre-master key”),若是单向认证,则用server公钥加密这个随机数,若是双向认证,则先用client端私钥加密这个随机数,在把加密后的密文用server公钥再加密一个,也就是加密了2次。
- 编码改变通知,意思就是之后发送的信息是通过会话秘钥加密后的
- 客户端握手结束通知,也包含前面所有内容hash,用于给服务器校验
如果是双向认证,客户端是在这一步发送客户端证书给服务器
第四步,服务器最后回应
服务器在收到加密后的第三个随机数后,用自己的私钥解密,如果是双向认证,还要用客户端公钥解密,得到pre-master key。然后:
- 编码改变通知,意思就是之后发送的信息是通过会话秘钥加密后的
- 客户端握手结束通知,也包含前面所有内容hash,用于给客户端校验
第三步、第四步提到的会话秘钥是由第一、二、三步产生的随机数通过双方事先商定好的秘钥生成机制生成出对称秘钥,之后在本次回话中双方都是用这个对称秘钥来加密解密信息。