{"id":4241,"date":"2026-11-08T05:57:00","date_gmt":"2026-11-08T05:57:00","guid":{"rendered":"https:\/\/www.ucartz.com\/blog\/tls-handshake\/"},"modified":"2026-11-09T22:05:23","modified_gmt":"2026-11-09T22:05:23","slug":"tls-handshake","status":"publish","type":"post","link":"https:\/\/www.ucartz.com\/blog\/tls-handshake\/","title":{"rendered":"TLS Handshake Explained: Steps in TLS 1.3 and TLS 1.2"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The TLS handshake is the short conversation a browser and a web server have before any HTTPS page data is sent. In it they agree on a TLS version and cipher, create shared encryption keys, and the server proves with its certificate that it really is the site you asked for. With TLS 1.3 this takes one network round trip; with the older TLS 1.2 it takes two. People still call it the &#8220;SSL handshake&#8221;, but SSL itself is long retired: <a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc9325\" target=\"_blank\" rel=\"noopener noreferrer\">RFC 9325<\/a> says implementations must not negotiate SSL 2 or SSL 3.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"300\" src=\"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/11\/tls-handshake-screenshot-1024x300.png\" alt=\"Terminal showing openssl s_client output with TLSv1.3 and TLS_AES_256_GCM_SHA384\" class=\"wp-image-4255\" srcset=\"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/11\/tls-handshake-screenshot-1024x300.png 1024w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/11\/tls-handshake-screenshot-300x88.png 300w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/11\/tls-handshake-screenshot-768x225.png 768w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/11\/tls-handshake-screenshot.png 1100w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">A real TLS 1.3 handshake with example.com: protocol version, cipher suite and the server certificate<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What the handshake has to achieve<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The TLS 1.3 standard, <a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc8446\" target=\"_blank\" rel=\"noopener noreferrer\">RFC 8446<\/a>, splits the handshake into three phases:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Key exchange:<\/strong> agree on the cryptographic parameters and create shared keying material. Everything after this phase is encrypted.<\/li>\n\n\n\n<li><strong>Server parameters:<\/strong> settle the remaining options, such as which application protocol (HTTP\/2 or HTTP\/1.1) to use and whether the client must show a certificate too.<\/li>\n\n\n\n<li><strong>Authentication:<\/strong> the server proves it owns the private key for its certificate, and both sides confirm that nobody tampered with the messages so far.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">If any part fails, the connection is closed, often with a TLS alert message, and no page data is sent at all. That is what the browser reports as a handshake or secure connection error.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The TLS 1.3 handshake, step by step<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To see the real messages, we ran nginx 1.31.6 in a Docker container with a test certificate for <code>shop.example.test<\/code> and connected with the OpenSSL 3.5.8 <code>s_client<\/code> tool. The <code>-msg<\/code> option prints every handshake message (we removed the record-header lines):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ openssl s_client -connect shop.example.test:443 -servername shop.example.test -tls1_3 -msg -brief\n&gt;&gt;&gt; TLS 1.3, Handshake [length 05c0], ClientHello\n&lt;&lt;&lt; TLS 1.3, Handshake [length 04ba], ServerHello\n&lt;&lt;&lt; TLS 1.3, ChangeCipherSpec [length 0001]\n&lt;&lt;&lt; TLS 1.3, Handshake [length 000a], EncryptedExtensions\n&lt;&lt;&lt; TLS 1.3, Handshake [length 01bd], Certificate\n&lt;&lt;&lt; TLS 1.3, Handshake [length 0050], CertificateVerify\n&lt;&lt;&lt; TLS 1.3, Handshake [length 0034], Finished\n&gt;&gt;&gt; TLS 1.3, ChangeCipherSpec [length 0001]\n&gt;&gt;&gt; TLS 1.3, Handshake [length 0034], Finished\nProtocol version: TLSv1.3\nCiphersuite: TLS_AES_256_GCM_SHA384\nNegotiated TLS1.3 group: X25519MLKEM768<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>&gt;&gt;&gt;<\/code> is the client sending, <code>&lt;&lt;&lt;<\/code> is the server answering. Here is what each message does:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>ClientHello:<\/strong> the client sends a random number, the TLS versions and cipher suites it supports, and its half of a key exchange in the <code>key_share<\/code> extension. It also names the site it wants (SNI, server name indication) and the protocols it can speak (ALPN, for example <code>h2<\/code> for HTTP\/2).<\/li>\n\n\n\n<li><strong>ServerHello:<\/strong> the server picks the version and cipher suite and sends its own key share. From these two messages both sides calculate the same secret, and every message after this point is encrypted.<\/li>\n\n\n\n<li><strong>EncryptedExtensions:<\/strong> the answers to the client&#8217;s other requests, such as the chosen ALPN protocol.<\/li>\n\n\n\n<li><strong>Certificate and CertificateVerify:<\/strong> the server sends its certificate chain, then a signature over the whole handshake made with the certificate&#8217;s private key. That signature is the proof of identity: a copied certificate is useless without the key.<\/li>\n\n\n\n<li><strong>Finished (both sides):<\/strong> a MAC over the entire handshake. If anyone changed a single byte on the way, the values would not match and the connection would stop.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">The two <code>ChangeCipherSpec<\/code> lines are not real TLS 1.3 messages. RFC 8446 (Appendix D.4) describes this &#8220;middlebox compatibility mode&#8221;: dummy records that make the handshake look like TLS 1.2 so that old firewalls and proxies let it through.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Note the group <code>X25519MLKEM768<\/code> and the large ClientHello (0x05c0, 1,472 bytes). OpenSSL 3.5 added hybrid post-quantum key exchange and offers it by default. The OpenSSL documentation warns that in rare cases the bigger ClientHello no longer fits in one TCP segment and badly behaved firewall software can break the handshake, so keep this in mind if a firewall is in the path and only new clients fail.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The TLS 1.2 handshake: one extra round trip<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The same server and client, forced to TLS 1.2 with <code>-tls1_2<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; TLS 1.2, Handshake [length 00d4], ClientHello\n&lt;&lt;&lt; TLS 1.2, Handshake [length 0045], ServerHello\n&lt;&lt;&lt; TLS 1.2, Handshake [length 01ba], Certificate\n&lt;&lt;&lt; TLS 1.2, Handshake [length 0074], ServerKeyExchange\n&lt;&lt;&lt; TLS 1.2, Handshake [length 0004], ServerHelloDone\n&gt;&gt;&gt; TLS 1.2, Handshake [length 0025], ClientKeyExchange\n&gt;&gt;&gt; TLS 1.2, ChangeCipherSpec [length 0001]\n&gt;&gt;&gt; TLS 1.2, Handshake [length 0010], Finished\n&lt;&lt;&lt; TLS 1.2, Handshake [length 00da], NewSessionTicket\n&lt;&lt;&lt; TLS 1.2, Handshake [length 0010], Finished\nProtocol version: TLSv1.2\nCiphersuite: ECDHE-ECDSA-AES256-GCM-SHA384<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">(The server also sends a ChangeCipherSpec before its Finished; OpenSSL shows it only as a bare record header, so it is not in the list.) In TLS 1.2 the client does not send a key share in its first message. It has to wait for the server&#8217;s hello, certificate and key exchange, then send its own key exchange, and only after the server&#8217;s Finished comes back can the page be requested. The certificate also travels unencrypted, so anyone watching the network can read it.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><\/th><th>TLS 1.2<\/th><th>TLS 1.3<\/th><\/tr><\/thead><tbody><tr><td>Round trips for a full handshake<\/td><td>2<\/td><td>1<\/td><\/tr><tr><td>Certificate sent<\/td><td>In the clear<\/td><td>Encrypted<\/td><\/tr><tr><td>Key exchange<\/td><td>ECDHE, DHE or static RSA<\/td><td>(EC)DHE, PSK, or both; static RSA and static Diffie-Hellman removed, so every public-key exchange has forward secrecy<\/td><\/tr><tr><td>Ciphers<\/td><td>Many, including legacy CBC suites<\/td><td>AEAD only (AES-GCM, ChaCha20-Poly1305, AES-CCM)<\/td><\/tr><tr><td>Resumed connection<\/td><td>1 round trip (abbreviated handshake)<\/td><td>1 round trip, or 0-RTT with early data<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">We timed it: 1 round trip versus 2<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To make the difference visible, we added 100 ms of delay to the server container&#8217;s network with Linux <code>tc netem<\/code>, so every round trip took about 100 ms, and asked curl 8.22.0 to report how long the TLS part took. Three runs of each gave the same picture:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Protocol<\/th><th>TLS handshake time<\/th><th>Round trips<\/th><\/tr><\/thead><tbody><tr><td>TLS 1.3<\/td><td>102 to 106 ms<\/td><td>1<\/td><\/tr><tr><td>TLS 1.2<\/td><td>205 to 213 ms<\/td><td>2<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The handshake time is curl&#8217;s <code>time_appconnect<\/code> minus <code>time_connect<\/code>. The cryptography itself took a few milliseconds; nearly all the time was waiting for packets. That is why the round-trip count matters so much for visitors far from your server, and why moving from TLS 1.2 to 1.3 makes the first page load feel faster on slow or distant connections.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Session resumption and 0-RTT<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">After a handshake the server can send a <code>NewSessionTicket<\/code>. curl showed two of them arriving after our TLS 1.3 handshake. On the next visit the client presents the ticket, and the server can skip the certificate step. We saved the session with <code>-sess_out<\/code> and reconnected with <code>-sess_in<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; TLS 1.3, Handshake [length 06ef], ClientHello\n&lt;&lt;&lt; TLS 1.3, Handshake [length 04c0], ServerHello\n&lt;&lt;&lt; TLS 1.3, Handshake [length 000a], EncryptedExtensions\n&lt;&lt;&lt; TLS 1.3, Handshake [length 0034], Finished\n&gt;&gt;&gt; TLS 1.3, Handshake [length 0034], Finished\nReused, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">No Certificate and no CertificateVerify this time. TLS 1.2 resumption behaved the same way: ServerHello, then Finished from both sides, one round trip instead of two.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">TLS 1.3 can go one step further with <strong>0-RTT<\/strong> (early data): a returning client sends its first request together with the ClientHello. RFC 8446 warns that 0-RTT data is not forward secret and that &#8220;there are no guarantees of non-replay between connections&#8221;, so an attacker could resend it. For that reason nginx has <code>ssl_early_data off<\/code> by default, and the <a href=\"https:\/\/nginx.org\/en\/docs\/http\/ngx_http_ssl_module.html\" target=\"_blank\" rel=\"noopener noreferrer\">nginx SSL module documentation<\/a> says requests sent in early data are subject to replay attacks. Leave it off unless your application only accepts safe, repeatable requests in early data.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to see a TLS handshake yourself<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">With curl, the verbose flag prints each handshake step and the result:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ curl -sv https:\/\/shop.example.test\/ -o \/dev\/null\n* ALPN: curl offers h2,http\/1.1\n* TLSv1.3 (OUT), TLS handshake, Client hello (1):\n* TLSv1.3 (IN), TLS handshake, Server hello (2):\n* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):\n* TLSv1.3 (IN), TLS handshake, Certificate (11):\n* TLSv1.3 (IN), TLS handshake, CERT verify (15):\n* TLSv1.3 (IN), TLS handshake, Finished (20):\n* TLSv1.3 (OUT), TLS handshake, Finished (20):\n* SSL connection using TLSv1.3 \/ TLS_AES_256_GCM_SHA384 \/ X25519MLKEM768 \/ id-ecPublicKey\n* ALPN: server accepted h2\n* SSL certificate verified via OpenSSL.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">To check which versions a server accepts, try each one with OpenSSL (on Windows, see <a href=\"https:\/\/www.ucartz.com\/clients\/knowledgebase\/9336\/How-to-Install-OpenSSL-on-Windows.html\">how to install OpenSSL<\/a>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl s_client -connect example.com:443 -servername example.com -tls1_3 -brief &lt;\/dev\/null\nopenssl s_client -connect example.com:443 -servername example.com -tls1_2 -brief &lt;\/dev\/null<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Always pass <code>-servername<\/code>. Many sites share one IP address, and without SNI the server does not know which certificate to send. Our server refused an old TLS 1.1 attempt like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>error:0A00042E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version:ssl\/record\/rec_layer_s3.c:918:SSL alert number 70<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That refusal is correct. <a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc8996\" target=\"_blank\" rel=\"noopener noreferrer\">RFC 8996<\/a> says TLS 1.0 and TLS 1.1 must not be used, and OpenSSL 3.5 would not even offer TLS 1.1 from the client side until we lowered its security level.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Handshake settings worth checking on your server<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Protocols:<\/strong> allow TLS 1.2 and TLS 1.3 only. In nginx that is <code>ssl_protocols TLSv1.2 TLSv1.3;<\/code>, which is also the default in current nginx versions. RFC 9325 says implementations must support TLS 1.2, should support TLS 1.3, and must prefer TLS 1.3 when they have it.<\/li>\n\n\n\n<li><strong>A complete certificate chain:<\/strong> send the intermediate certificates with your own, or some clients will fail to verify it. <a href=\"https:\/\/www.ucartz.com\/clients\/knowledgebase\/9282\/SSL-Certificate-Not-Trusted-Causes-and-How-to-Fix-Them.html\">SSL certificate not trusted<\/a> covers chain, name and expiry problems.<\/li>\n\n\n\n<li><strong>Session resumption:<\/strong> nginx sends session tickets by default (<code>ssl_session_tickets on<\/code>), but its session cache is <code>none<\/code> unless you set one, for example <code>ssl_session_cache shared:SSL:10m;<\/code>.<\/li>\n\n\n\n<li><strong>Expiry:<\/strong> an expired certificate fails every handshake. <a href=\"https:\/\/www.ucartz.com\/clients\/knowledgebase\/9088\/How-to-Verify-SSL-Certificate-Expiry-and-Details-Using-OpenSSL.html\">Check the expiry date with OpenSSL<\/a> and automate renewal.<\/li>\n\n\n\n<li><strong>Ports:<\/strong> HTTPS normally uses TCP 443, and mail services have their own TLS ports. The <a href=\"https:\/\/www.ucartz.com\/clients\/knowledgebase\/9264\/HTTPS-and-SSL-Port-Numbers-443-465-587-993-995-and-cPanel-Ports.html\">HTTPS and SSL port list<\/a> has the full set.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">When the handshake does fail, the error message usually points to the cause: a version mismatch, plain HTTP on a TLS port, a certificate and key that do not match, or a firewall in the way. <a href=\"https:\/\/www.ucartz.com\/clients\/knowledgebase\/9308\/SSL-Handshake-Failed-Causes-and-How-to-Fix-It.html\">SSL Handshake Failed: Causes and How to Fix It<\/a> walks through each one with the exact messages. If you need a certificate for your site, Ucartz offers <a href=\"https:\/\/www.ucartz.com\/ssl-certificates\">DV, OV and wildcard SSL certificates<\/a> with free installation help.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>How the TLS handshake works in TLS 1.3 and TLS 1.2, with real OpenSSL output, measured round trips, session resumption and 0-RTT explained.<\/p>\n","protected":false},"author":4,"featured_media":4242,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[397,638],"tags":[80,190,1112,1113,1109,1111,1110,1108],"class_list":["post-4241","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-security","category-ssl","tag-https","tag-nginx","tag-openssl","tag-session-resumption","tag-ssl-handshake","tag-tls-1-2","tag-tls-1-3","tag-tls-handshake"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>TLS Handshake Explained: Steps in TLS 1.3 and TLS\u2026 | Ucartz<\/title>\n<meta name=\"description\" content=\"How the TLS handshake works in TLS 1.3 and TLS 1.2, with real OpenSSL output, measured round trips, session resumption and 0-RTT explained.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.ucartz.com\/blog\/tls-handshake\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"| Ucartz Blog | Ucartz\" \/>\n<meta property=\"og:description\" content=\"How the TLS handshake works in TLS 1.3 and TLS 1.2, with real OpenSSL output, measured round trips, session resumption and 0-RTT explained.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.ucartz.com\/blog\/tls-handshake\/\" \/>\n<meta property=\"og:site_name\" content=\"Ucartz Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/UcartzOnline\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-08T05:57:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-11-09T22:05:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/11\/tls-handshake.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Ria Febin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"| Ucartz Blog | Ucartz\" \/>\n<meta name=\"twitter:creator\" content=\"@ucartz\" \/>\n<meta name=\"twitter:site\" content=\"@ucartz\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ria Febin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@context\":\"https:\\\/\\\/schema.org\",\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/tls-handshake\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/tls-handshake\\\/\"},\"author\":{\"name\":\"Ria Febin\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/#\\\/schema\\\/person\\\/2d964b1b8325f8a5e55bed0d1e0fa1d0\"},\"headline\":\"TLS Handshake Explained: Steps in TLS 1.3 and TLS 1.2\",\"datePublished\":\"2026-11-08T05:57:00+00:00\",\"dateModified\":\"2026-11-09T22:05:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/tls-handshake\\\/\"},\"wordCount\":1281,\"publisher\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/tls-handshake\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/tls-handshake.jpg\",\"keywords\":[\"HTTPS\",\"Nginx\",\"openssl\",\"session resumption\",\"ssl handshake\",\"tls 1.2\",\"tls 1.3\",\"tls handshake\"],\"articleSection\":[\"Security\",\"SSL\"],\"inLanguage\":\"en-US\"},{\"@context\":\"https:\\\/\\\/schema.org\",\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/tls-handshake\\\/\",\"url\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/tls-handshake\\\/\",\"name\":\"| Ucartz Blog | Ucartz\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/tls-handshake\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/tls-handshake\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/tls-handshake.jpg\",\"datePublished\":\"2026-11-08T05:57:00+00:00\",\"dateModified\":\"2026-11-09T22:05:23+00:00\",\"description\":\"How the TLS handshake works in TLS 1.3 and TLS 1.2, with real OpenSSL output, measured round trips, session resumption and 0-RTT explained.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/tls-handshake\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/tls-handshake\\\/\"]}]},{\"@context\":\"https:\\\/\\\/schema.org\",\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/tls-handshake\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/tls-handshake.jpg\",\"contentUrl\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/tls-handshake.jpg\",\"width\":1200,\"height\":630,\"caption\":\"TLS Handshake Explained: Steps in TLS 1.3 and TLS 1.2\"},{\"@context\":\"https:\\\/\\\/schema.org\",\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/tls-handshake\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TLS Handshake Explained: Steps in TLS 1.3 and TLS 1.2\"}]},{\"@context\":\"https:\\\/\\\/schema.org\",\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/\",\"name\":\"Ucartz Blog\",\"description\":\"Guides on hosting, servers, streaming and automation\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/#organization\"},\"alternateName\":\"Ucartz\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@context\":\"https:\\\/\\\/schema.org\",\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/#organization\",\"name\":\"Ucartz Online Private Limited\",\"alternateName\":\"Ucartz\",\"url\":\"https:\\\/\\\/www.ucartz.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.ucartz.com\\\/assets\\\/images\\\/brand\\\/logo\\\/ucartz-logo-888x240.png\",\"contentUrl\":\"https:\\\/\\\/www.ucartz.com\\\/assets\\\/images\\\/brand\\\/logo\\\/ucartz-logo-888x240.png\",\"width\":888,\"height\":240,\"caption\":\"Ucartz\"},\"image\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/UcartzOnline\",\"https:\\\/\\\/twitter.com\\\/ucartz\",\"https:\\\/\\\/www.instagram.com\\\/ucartz_com\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/ucartzonline\",\"https:\\\/\\\/github.com\\\/ucartz\",\"https:\\\/\\\/n8n.io\\\/creators\\\/ucartz\\\/\",\"https:\\\/\\\/marketplace.whmcs.com\\\/group\\\/Ucartz\"]},{\"@context\":\"https:\\\/\\\/schema.org\",\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/#\\\/schema\\\/person\\\/2d964b1b8325f8a5e55bed0d1e0fa1d0\",\"name\":\"Ria Febin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/wp-content\\\/themes\\\/ucartz-blog\\\/assets\\\/images\\\/authors\\\/ria-febin-112.webp\",\"url\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/wp-content\\\/themes\\\/ucartz-blog\\\/assets\\\/images\\\/authors\\\/ria-febin-112.webp\",\"contentUrl\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/wp-content\\\/themes\\\/ucartz-blog\\\/assets\\\/images\\\/authors\\\/ria-febin-112.webp\",\"caption\":\"Ria Febin\"},\"url\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/author\\\/ria-febin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"TLS Handshake Explained: Steps in TLS 1.3 and TLS\u2026 | Ucartz","description":"How the TLS handshake works in TLS 1.3 and TLS 1.2, with real OpenSSL output, measured round trips, session resumption and 0-RTT explained.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.ucartz.com\/blog\/tls-handshake\/","og_locale":"en_US","og_type":"article","og_title":"| Ucartz Blog | Ucartz","og_description":"How the TLS handshake works in TLS 1.3 and TLS 1.2, with real OpenSSL output, measured round trips, session resumption and 0-RTT explained.","og_url":"https:\/\/www.ucartz.com\/blog\/tls-handshake\/","og_site_name":"Ucartz Blog","article_publisher":"https:\/\/www.facebook.com\/UcartzOnline","article_published_time":"2026-11-08T05:57:00+00:00","article_modified_time":"2026-11-09T22:05:23+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/11\/tls-handshake.jpg","type":"image\/jpeg"}],"author":"Ria Febin","twitter_card":"summary_large_image","twitter_title":"| Ucartz Blog | Ucartz","twitter_creator":"@ucartz","twitter_site":"@ucartz","twitter_misc":{"Written by":"Ria Febin","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@context":"https:\/\/schema.org","@type":"Article","@id":"https:\/\/www.ucartz.com\/blog\/tls-handshake\/#article","isPartOf":{"@id":"https:\/\/www.ucartz.com\/blog\/tls-handshake\/"},"author":{"name":"Ria Febin","@id":"https:\/\/www.ucartz.com\/blog\/#\/schema\/person\/2d964b1b8325f8a5e55bed0d1e0fa1d0"},"headline":"TLS Handshake Explained: Steps in TLS 1.3 and TLS 1.2","datePublished":"2026-11-08T05:57:00+00:00","dateModified":"2026-11-09T22:05:23+00:00","mainEntityOfPage":{"@id":"https:\/\/www.ucartz.com\/blog\/tls-handshake\/"},"wordCount":1281,"publisher":{"@id":"https:\/\/www.ucartz.com\/#organization"},"image":{"@id":"https:\/\/www.ucartz.com\/blog\/tls-handshake\/#primaryimage"},"thumbnailUrl":"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/11\/tls-handshake.jpg","keywords":["HTTPS","Nginx","openssl","session resumption","ssl handshake","tls 1.2","tls 1.3","tls handshake"],"articleSection":["Security","SSL"],"inLanguage":"en-US"},{"@context":"https:\/\/schema.org","@type":"WebPage","@id":"https:\/\/www.ucartz.com\/blog\/tls-handshake\/","url":"https:\/\/www.ucartz.com\/blog\/tls-handshake\/","name":"| Ucartz Blog | Ucartz","isPartOf":{"@id":"https:\/\/www.ucartz.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.ucartz.com\/blog\/tls-handshake\/#primaryimage"},"image":{"@id":"https:\/\/www.ucartz.com\/blog\/tls-handshake\/#primaryimage"},"thumbnailUrl":"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/11\/tls-handshake.jpg","datePublished":"2026-11-08T05:57:00+00:00","dateModified":"2026-11-09T22:05:23+00:00","description":"How the TLS handshake works in TLS 1.3 and TLS 1.2, with real OpenSSL output, measured round trips, session resumption and 0-RTT explained.","breadcrumb":{"@id":"https:\/\/www.ucartz.com\/blog\/tls-handshake\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.ucartz.com\/blog\/tls-handshake\/"]}]},{"@context":"https:\/\/schema.org","@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.ucartz.com\/blog\/tls-handshake\/#primaryimage","url":"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/11\/tls-handshake.jpg","contentUrl":"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/11\/tls-handshake.jpg","width":1200,"height":630,"caption":"TLS Handshake Explained: Steps in TLS 1.3 and TLS 1.2"},{"@context":"https:\/\/schema.org","@type":"BreadcrumbList","@id":"https:\/\/www.ucartz.com\/blog\/tls-handshake\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.ucartz.com\/blog\/"},{"@type":"ListItem","position":2,"name":"TLS Handshake Explained: Steps in TLS 1.3 and TLS 1.2"}]},{"@context":"https:\/\/schema.org","@type":"WebSite","@id":"https:\/\/www.ucartz.com\/blog\/#website","url":"https:\/\/www.ucartz.com\/blog\/","name":"Ucartz Blog","description":"Guides on hosting, servers, streaming and automation","publisher":{"@id":"https:\/\/www.ucartz.com\/#organization"},"alternateName":"Ucartz","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.ucartz.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@context":"https:\/\/schema.org","@type":"Organization","@id":"https:\/\/www.ucartz.com\/#organization","name":"Ucartz Online Private Limited","alternateName":"Ucartz","url":"https:\/\/www.ucartz.com\/","logo":{"@type":"ImageObject","@id":"https:\/\/www.ucartz.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.ucartz.com\/assets\/images\/brand\/logo\/ucartz-logo-888x240.png","contentUrl":"https:\/\/www.ucartz.com\/assets\/images\/brand\/logo\/ucartz-logo-888x240.png","width":888,"height":240,"caption":"Ucartz"},"image":{"@id":"https:\/\/www.ucartz.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/UcartzOnline","https:\/\/twitter.com\/ucartz","https:\/\/www.instagram.com\/ucartz_com","https:\/\/www.linkedin.com\/company\/ucartzonline","https:\/\/github.com\/ucartz","https:\/\/n8n.io\/creators\/ucartz\/","https:\/\/marketplace.whmcs.com\/group\/Ucartz"]},{"@context":"https:\/\/schema.org","@type":"Person","@id":"https:\/\/www.ucartz.com\/blog\/#\/schema\/person\/2d964b1b8325f8a5e55bed0d1e0fa1d0","name":"Ria Febin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.ucartz.com\/blog\/wp-content\/themes\/ucartz-blog\/assets\/images\/authors\/ria-febin-112.webp","url":"https:\/\/www.ucartz.com\/blog\/wp-content\/themes\/ucartz-blog\/assets\/images\/authors\/ria-febin-112.webp","contentUrl":"https:\/\/www.ucartz.com\/blog\/wp-content\/themes\/ucartz-blog\/assets\/images\/authors\/ria-febin-112.webp","caption":"Ria Febin"},"url":"https:\/\/www.ucartz.com\/blog\/author\/ria-febin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/posts\/4241","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/comments?post=4241"}],"version-history":[{"count":1,"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/posts\/4241\/revisions"}],"predecessor-version":[{"id":4256,"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/posts\/4241\/revisions\/4256"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/media\/4242"}],"wp:attachment":[{"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/media?parent=4241"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/categories?post=4241"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/tags?post=4241"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}