声明:这篇博客只是草稿,作者也对tcp/ip等网络知识不精通,只是工作上使用到 ssl,所以研究了下,但也是只是通过大量翻网上的已有的ssl/tls博客获取得知识,暂时没有通过抓包软件之类的工具实际看过ssl/tls的报文。
什么是ssl/tls
SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层与应用层之间对网络连接进行加密。
大致原理
客户端获取服务端证书并校验证书的真实性,然后客户端使用服务端证书(证书里含有公钥)和服务端(服务端有与之对应私钥)之间进行加密传输,讨论出一个会话密钥(对称加密)用于之后的会话信息加密,至此ssl的握手协议阶段结束。
接下来,客户端与服务端的会话使用只有两者才知道会话密钥进行信息加密传输,这是ssl的记录协议阶段。
具体原理
(1)客户端 => 服务端
发送随机数a和客户端支持的对称加密算法列表
(2)服务端==》客户端
发送随机数b和指定对称加密算法(从客户端支持对称加密算法中选取)及服务端证书。
(3)客户端 => 服务端
客户端通过证书链校验证书的真实性,通过验证后生成随机数c(官称pre-master-key),并使用服务端证书中的公钥加密传输给服务端
(4)客户端和服务端通过a、b、c三个随机数生成会话密钥,也叫主密钥(master-key),ssl的握手结束。
(5)使用会话密钥加密传输会话信息。
=========================================================
上面这个流程适用https(即http+ssl),https下客户端获取服务端证书一般是由服务端返回,客户端进行证书真实性的校验。像我使用的iot情况下(mqtt+ssl),客户端即设备端则一般是自带服务端证书。
https下的客户端怎么进行证书真实性的校验?
证书链,以浏览器为客户端举例,一般浏览器会内置些可信任的证书。
浏览器在获取到通信的服务端A证书后,会通过服务端A证书找到签发服务端A证书的上级机构B,获取上级机构B的证书来校验服务端A证书是否为上级机构B证书签署的,是则继续往上找,直至找到的证书也在浏览器可信任的证书列表里,至此服务端A证书的校验通过。
讲下证书的生成
先生成证书的私钥文件cakey.pem,后根据私钥和自行输入的一些信息(比如省份,城市,公司名,公用名称等)生成证书cacert.crt,这种自签发证书叫根证书,因为没有上级证书)
还有一种证书是有上级证书签发的,。。。嗯我也不知道叫什么好,暂时叫它普通证书吧。
普通证书的生成,也是要先生成私钥文件key.pem,后根据私钥和自行输入的一些信息(比如省份,城市,公司名,公用名称等)生成证书请求文件cert.csr,再拿这个证书请求文件cert.csr去找证书签发机构(你自己找的证书)签发,得到证书文件cert.crt。
根证书和普通证书的结构是一样,都是X509结构。
ps: cert.csr中是没有私钥的。
给个证书生成的具体例子
以linux下的openssl工具为例
#生成自签发证书
openssl genrsa -out cakey.pem 2048
openssl req -new -x509 -days 3650 -sha256 -key cakey.pem -out certs/cacert.pem -subj “/C=CN/ST=GuangZhou/O=Alibaba/CN=www.iibaba.com”
#签发服务端证书
openssl genrsa -out key.pem 2048
openssl req -new -key key.pem -out cert.csr -subj “/C=CN/ST=GuangZhou/O=Alibaba/CN=www.iibaba.com”
openssl x509 -req -in cert.csr -CA cacert.pem -CAkey cakey.pem -CAcreateserial -out cert.crt -days 3650 -sha256
//第三行命令是证书签发机构执行的,当然如果上级证书及私钥都在你手上你可以自己执行签发
上级证书是如何签发证书的,及上级证书是如何验证证书是它签发的。
上级机构签发证书时,会把下级证书的信息(比如证书所有者的信息,公司名称等)和下级证书的公钥进行消息摘要(如md5)然后用上级机构的私钥进行加密。私钥加密得到的签名sign放入下级证书中(嗯,是X509结构的三大顶级字段之一,三大字段-》证书信息,消息摘要算法(如MD5),签名sign),至此签发完成!
如何验证证书?
用证书中的写明的消息摘要算法对证书信息进行消息摘要A,然后用上级证书解密sign得到消息摘要B,相比较,相同则证书确实是上级机构签发的!
以上都是我猜的。。。。哈。。。哈。。。哈。。。。!
委婉代序。。。。2021-03-29