TLSv1.2于2008年8月发布,时隔10年,TLSv1.3于2018年8月发布,在性能优化和安全性方面有了很大的改变。对于升级冲突,TLSv1.3也做了兼容性处理,通过增加扩展协议支持老版本的客户端和服务器。SecurityTLSv1.2支持多种密码套件,与旧版本完全兼容。其中部分算法加密强度较弱,部分安全漏洞容易被攻击者利用,给业务带来潜在的安全隐患。隐患。TLSv1.3去除了这些不安全的加密算法,简化了密码套件,减少了服务器握手过程中的一些选择。删除了对MD5、SHA1加密哈希函数的支持,推荐使用SHA2(例如SHA-256)。删除RSA和所有静态密钥(密钥协议不是前向安全的)。溢出RC4流密码,DES对称加密算法。密钥协商的椭圆曲线算法增加https://www.wanweibaike.net/wiki-X25519支持。支持带有Poly1305消息认证码的ChaCha20流加密算法,流加密也是一种对称加密算法。去掉了CBC包模式,TLSv1.3对称加密只支持三种模式:AESGCM、AESCCM、ChaCha20**-**Poly1305。服务器端“ServerHello”之后的报文会被加密传输,所以常规的抓包分析会有疑惑,为什么看不到证书信息。性能优化性能优化的一个显着变化是TLS握手阶段的简化,由TLSv1.2中的2-RTT缩短为1-RTT。同时,TLSv1.3还引入了第一个链接建立后的0-RTT的概念。来源https://www.a10networks.com/wp-content/uploads/differences-between-tls-1.2-and-tls-1.3-full-handshake.pngkeynegotiationrequiresclient/serviceinTLSv1.2后两者双方交换随机数,服务器发送证书,双方发送“客户端/服务器密钥交换”消息,交换密钥协商所需的参数信息。在安全性方面,TLSv1.3去除了很多不安全的算法,简化了密码套件,现在已经去除了客户端发送“ClientHello”消息时包含在扩展协议中的“Clent/ServerKeyExchange”消息携带支持的椭圆曲线名称、临时公钥和签名信息。服务器收到消息后,在“ServerHello”消息中将选择的关键协商参数告诉客户端,这样可以节省一次消息往返(1-RTT)。ClientServerKey^ClientHelloExch|+key_share*|+signature_algorithms*|+psk_key_exchange_modes*v+pre_shared_key*------>ServerHello^Key+key_share*|Exch+pre_shared_key*v{EncryptedExtensions}^Server{CertificateRequest*}vParams{证书*}^{CertificateVerify*}|Auth{Finished}v<-------[ApplicationData*]^{Certificate*}Auth|{CertificateVerify*}v{Finished}------->[ApplicationData]<-------->[ApplicationData]ThebasicfullTLShandshake当访问一个以前访问过的站点时,客户端可以将前一个会话的预共享密钥(PSK)传递给第一个消息数据发送到服务器来实现“零往返时间(0-RTT)”。ClientServerClientHello+early_data+key_share*+psk_key_exchange_modes+pre_shared_key(ApplicationData*)------>ServerHello+pre_shared_key+key_share*{EncryptedExtensions}+early_data*{Finished}<--------[ApplicationData*](EndOfEarlyData){Finished}-------->[ApplicationData]<-------->[ApplicationData]MessageFlowfora0-RTTHandshakeTLSv1.3数据包捕获分析,客户端/服务器完成TLS将握手作为一个例如,我们通过抓包分析来看一下TLSv1.3的握手过程。下图是抓取的www.zhihu.com网站数据报文,报文已经解密,否则“ChangeCipherSpec”报文后的数据已经加密,无法解析。抓包请参考《网络协议那些事儿——如何抓包解密HTTPS加密数据?》。image.pngTLSv1.3握手流程如下图所示:tls-1-3-full-handshake.jpgClientHello握手开始。客户端告诉服务器它的Random、SessionID、密码套件等。另外,TLSv1.3需要注意“扩展协议”。TLSv1.3通过扩展协议实现“向前兼容”。当客户端请求时,它告诉服务器它支持的协议和一些其他的扩展协议参数。,如果旧版本不识别,则忽略它。我们来看几个主要的扩展协议:supported_versions:客户端支持的TLS版本,供服务端接收后选择。supported_groups:支持的椭圆曲线名称key_share:椭圆曲线名称和对应的临时公钥信息。signature_algorithms:签名TransportLayerSecurityTLSv1.3RecordLayer:HandshakeProtocol:ClientHelloVersion:TLS1.0(0x0301)HandshakeProtocol:ClientHelloHandshakeType:ClientHello(1)Version:TLS1.2(0x0303)Random:77f485a55b836cbaf4328ea270082cdf35fd8132aa7487eae19997c8939a292aSessionID:8d4609d9f0785880eb9443eff3867a63c23fb2e23fdf80d225c1a5a25a900eeeCipherSuites(16suites)CipherSuite:Reserved(GREASE)(0x1a1a)CipherSuite:TLS_AES_128_GCM_SHA256(0x1301)CipherSuite:TLS_AES_256_GCM_SHA384(0x1302)CipherSuite:TLS_CHACHA20_POLY1305_SHA256(0x1303)Extension:signature_algorithms(len=18)Extension:supported_groups(len=10)SupportedGroups(4groups)SupportedGroup:Reserved(GREASE)(0xcaca)SupportedGroup:x25519(0x001d)SupportedGroup:secp256r1(0x0017)SupportedGroup:secp384r1(0x0018)Extension:key_share(len=43)Type:key_share(51)KeyShareextensionClientKeyShareLength:41KeyShareEntry:Group:Reserved(GREASE),KeyExchangelength:1KeyShareEntry:Group:x25519,KeyExchangelength32组:x25519(29)KeyExchangeLength:32KeyExchange:51afc57ca38df354f6d4389629e222ca2654d88f2800cc84f8cb74eefd473f4bExtension:supported_versions(len=11)Type:supported_versions(43)SupportedVersionslength:10SupportedVersion:TLS1.3(0x0304)SupportedVersion:TLS1.2(0x0303)ServerHello服务端收到客户端请求后,返回选择的密码套件,ServerRandom,选择的椭圆曲线名称和对应的公钥(ServerParams),支持的TLS版本这次密码套件看起来比TLS_AES_256_GCM_SHA384短很多,用于协商密钥的参数放在key_share扩展协议。TLSv1.3RecordLayer:HandshakeProtocol:ServerHelloContentType:Handshake(22)HandshakeProtocol:ServerHelloHandshakeType:ServerHello(2)Version:TLS1.2(0x0303)Random:1f354a11aea2109ba22e26d663a70bddd78a87a79fed85be2d03d5fc9deb59a5SessionID:8d4609d9f0785880eb9443eff3867a63c23fb2e23fdf80d225c1a5a25a900eeeCipherSuite:TLS_AES_256_GCM_SHA384(0x1302)CompressionMethod:null(0)ExtensionsLength:46Extension:supported_versions(len=2)SupportedVersion:TLS1.3(0x0304)Extension:key_share(len=36)Type:key_share(51)KeyShareextensionKeyShareEntry:Group:x25519,KeyExchangelength:32Group:x25519(29)KeyExchange:ac1e7f0dd5a4ee40fd088a8c00113178bafb2df59e0d6fc74ce77452732bc44d服务端此时拿到了Client可以先用Random、ClientParams、ServerRandom、ServerParams这四个参数来计算pre-masterkey。在TLSv1.2中,在第一次消息往返之后,客户端首先发起请求。服务器计算出对称加密的会话密钥后,发送ChangeCipherSpec消息并切换到加密模式。所有后续的消息(证书、证书验证)传输都会被加密,这也减少了握手时的明文传输。Certificate、CertificateVerify、Finished除了Certificate,TLSv1.3还有一个“CertificateVerify”消息,使用服务器的私钥对握手信息进行签名,加强安全措施。TransportLayerSecurityTLSv1.3RecordLayer:HandshakeProtocol:CertificateTLSv1.3RecordLayer:HandshakeProtocol:CertificateVerifyHandshakeProtocol:CertificateVerifySignatureAlgorithm:rsa_pss_rsae_sha256(0x0804)SignatureHashAlgorithmHash:Unknown(8)SignatureHashAlgorithmSignature:Unknown(4)Signaturelength:256Signature:03208990ec0d4bde4af8e2356ae7e86a045137afa5262ec7c82d55e95ba23b6eb5876ebb…TLSv1.3RecordLayer:HandshakeProtocol:FinishedHandshakeProtocol:FinishedVerifyData客户端切换加密模式客户端在得到ClientRandom、ClientParams、ServerRandom、ServerParams这四个参数计算出最终的会话密钥后,还会发送“CertificateVerify”和“Finished”消息。当客户端和服务端都发送完“Finished”消息后,握手就完成了,接下来就可以安全的传输数据了。图片.png
