TLS 1.3(RFC 9846 §2)只需一次往返:客户端发送 ClientHello,其中包含支持的版本、密码套件、组、密钥共享(key share)和签名算法;服务器回复 ServerHello(包含服务器的密钥共享),随后发送已加密的 EncryptedExtensions、Certificate、CertificateVerify(对握手记录哈希的签名)和 Finished;客户端回复自己的 Finished 后即可发送数据。如果客户端猜错了组,HelloRetryRequest 会额外增加一次往返。
TLS 1.2 需要两次往返,以明文发送证书,并且在使用 RSA 密钥传输时不对任何临时值签名。使用预共享密钥恢复会话时会跳过基于证书的身份验证,0-RTT 则允许客户端发送早期数据,代价是失去重放保护。
调试:openssl s_client -connect host:443 -servername host -tls1_3 -msg 会打印每条消息;大多数故障是名称不匹配、缺少中间证书、没有双方共同支持的加密算法或组,或者中间设备干扰较大的 ClientHello 消息(后量子密钥共享超过 1 KB,这个问题再次变得突出)。