1、什么是SSL-TLS?
TLS是SSL发展过来的,叫做传输层安全协议,简单来说就只在TCP传输层上面的明文加密,例如HTTP协议加上TLS就是HTTPS,使用加密的目的就是保证数据传输安全。
下面是SSL的发展:
SSL1.0: 已废除
SSL2.0: RFC6176,已废除
SSL3.0: RFC6101,基本废除
TLS1.0: RFC2246,目前大都支持此种方式
TLS1.1: RFC4346
TLS1.2: RFC5246,部分服务器支持,没有广泛使用
TLS1.3: IETF正在规划
2、 CA证书、SSL Server、SSL Client
2.1CA证书:证书授权中心,颁发根证书,证书的颁发基于信任,也就是公众信任第三方机构颁发证书;第三方机构颁发证书,也可以吊销证书。
2.2
2.2.1单项验证流程:试试r
a、SSL Server自己生成私钥/公钥对 server.key/server.pub,使用server.pub生成一个server.req,文件,该文件用来请求CA,CA验证后,会用ca.key生成一个server.crt
b、ca.key和ca.crt是一对,因此可以使用ca.crt来对server.crt进行验证。
单项验证以及双向验证:
何为SSL/TLS单向认证,双向认证?
单向认证指的是只有一个对象校验对端的证书合法性。例如客户端验证服务器的合法性;服务器验证客户端的合法性
通常都是client来校验服务器的合法性。那么client需要一个ca.crt,服务器需要server.crt,server.key
双向认证指的是相互校验,服务器需要校验每个client,client也需要校验服务器。
server 需要 server.key 、server.crt 、ca.crt
client 需要 client.key 、client.crt 、ca.crt
证书发起流程如下:
1、client hello
加密通信请求一般由客户端发起,该请求一般是明文传输,其中包括版本信息,加密套件候选列表,加密算法支持列表,随机数等等;支持的TLS 协议版本低到高依次是SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2,目前不再使用低于TLS1版本加密
1.1加密套件列表:每个加密套件对应TLS原理中的四个功能组合:认证算法,秘钥交换算法,对称加密算法以及信息摘要。
1.2支持的压缩算法列表,用于后续信息压缩传输;
1.3随机数,用于后续秘钥生成
2、server_hello+server_certificate+sever_hello_done
server_hello, 服务端返回协商的信息结果,包括选择使用的协议版本 version,选择的加密套件 cipher suite,选择的压缩算法 compression method、随机数 random_S 等,其中随机数用于后续的密钥协商;
server_certificates, 服务器端配置对应的证书链,用于身份验证与密钥交换;
server_hello_done,通知客户端 server_hello 信息发送结束;
3、证书校验
[证书链]的可信性 trusted certificate path,方法如前文所述;
证书是否吊销 revocation,有两类方式离线 CRL 与在线 OCSP,不同的客户端行为会不同;
有效期 expiry date,证书是否在有效时间范围;
域名 domain,核查证书域名是否与当前的访问域名匹配,匹配规则后续分析;
4、client_key_exchange+change_cipher_spec+encrypted_handshake_message
client_key_exchange,合法性验证通过之后,客户端计算产生随机数字 Pre-master,并用证书公钥加密,发送给服务器;
此时客户端已经获取全部的计算协商密钥需要的信息:两个明文随机数 random_C 和 random_S 与自己计算产生的 Pre-master,计算得到协商密钥;
enc_key=Fuc(random_C, random_S, Pre-Master)
change_cipher_spec,客户端通知服务器后续的通信都采用协商的通信密钥和加密算法进行加密通信;
encrypted_handshake_message,结合之前所有通信参数的 hash 值与其它相关信息生成一段数据,采用协商密钥 session secret 与算法进行加密,然后发送给服务器用于数据与握手验证;
5、change_cipher_spec+encrypted_handshake_message
服务器用私钥解密加密的 Pre-master 数据,基于之前交换的两个明文随机数 random_C 和 random_S,计算得到协商密钥:enc_key=Fuc(random_C, random_S, Pre-Master);
计算之前所有接收信息的 hash 值,然后解密客户端发送的 encrypted_handshake_message,验证数据和密钥正确性;
change_cipher_spec, 验证通过之后,服务器同样发送 change_cipher_spec 以告知客户端后续的通信都采用协商的密钥与算法进行加密通信;
encrypted_handshake_message, 服务器也结合所有当前的通信参数信息生成一段数据并采用协商密钥 session secret 与算法加密并发送到客户端;
6、shakehand over
客户端计算所有接收信息的 hash 值,并采用协商密钥解密 encrypted_handshake_message,验证服务器发送的数据和密钥,验证通过则握手完成;
7、加密通信:使用之前协商的加密方式与协商秘钥进行通信。
校验服务器流程:
client hello 包内容:
server hello 包内容
交换协商密钥:
加密握手信息:
之后使用协商密钥进行加密,进行通信。
详细请看:https://blog.csdn.net/espressif/article/details/78541410