← Home ← Codex ← DEBT
Browse by Category
+ added · updated 7d
← Back to glossary

TLS Handshake

Networking Intermediate
debt(d5/e3/b3/t5)
d5 Detectability Operational debt — how invisible misuse is to your safety net

Closest to 'specialist tool catches it' (d5). The detection_hints list ssllabs, nginx-config, and openssl — all specialist/external tools. Common mistakes like leaving TLS 1.0/1.1 enabled or weak cipher suites are invisible to standard linters and only surface via dedicated TLS scanning tools like ssllabs.com, which the term explicitly calls out as necessary for finding misconfigurations.

e3 Effort Remediation debt — work required to fix once spotted

Closest to 'simple parameterised fix' (e3). The quick_fix is enabling TLS 1.3 in Nginx config — a small, localised change in one config file. However, addressing all common mistakes (OCSP stapling, disabling weak cipher suites, removing deprecated protocol versions) requires a handful of coordinated config changes, making it slightly more than a one-liner but well within one component (the server TLS config).

b3 Burden Structural debt — long-term weight of choosing wrong

Closest to 'localised tax' (b3). The applies_to scope is web contexts, and the TLS config is primarily a server-level concern (nginx/server config). Once correctly configured it stays stable, imposing minimal ongoing maintenance burden. It doesn't reach across the application codebase or shape architectural decisions significantly.

t5 Trap Cognitive debt — how counter-intuitive correct behaviour is

Closest to 'notable trap' (t5). The misconception field states that TLS 1.2 and 1.3 are treated as interchangeable, when TLS 1.3 removes weak ciphers, reduces latency with 1-RTT, and provides forward secrecy by default. This is a documented, well-known gotcha that developers eventually learn, but is not immediately obvious. It doesn't quite rise to t7 because the versions are clearly numbered differently, but the behavioral delta is substantial enough to surprise most developers.

About DEBT scoring →

Also Known As

SSL handshake HTTPS handshake

TL;DR

The negotiation process between client and server that establishes an encrypted HTTPS connection, agreeing on cipher suites and exchanging keys.

Explanation

The TLS handshake authenticates the server (and optionally the client), negotiates the TLS version and cipher suite, and establishes session keys. TLS 1.3 completes in one round-trip vs TLS 1.2's two, significantly reducing connection latency. Understanding the handshake is essential for diagnosing certificate errors, choosing strong cipher suites, and implementing mutual TLS (mTLS) for service-to-service authentication.

Diagram

sequenceDiagram
    participant C as Client
    participant S as Server
    C->>S: ClientHello - TLS version, cipher suites
    S->>C: ServerHello - chosen cipher
    S->>C: Certificate with public key
    C->>C: Verify certificate chain
    C->>S: Key exchange encrypted with server public key
    C->>S: Finished encrypted
    S->>C: Finished encrypted
    Note over C,S: Symmetric encryption now active

Common Misconception

TLS 1.2 and TLS 1.3 are interchangeable — TLS 1.3 removes weak cipher suites, reduces latency with 1-RTT, and provides forward secrecy by default.

Why It Matters

A misconfigured TLS handshake exposes connections to downgrade attacks, MITM interception, or connection failures — and adds unnecessary latency when not tuned.

Common Mistakes

  • Leaving TLS 1.0/1.1 enabled — both are deprecated and vulnerable to known downgrade attacks.
  • Not enabling OCSP stapling — clients make a separate round-trip to check certificate revocation.
  • Weak cipher suites (RC4, 3DES, NULL) still listed as acceptable in server config.
  • Not testing with ssllabs.com — misconfigurations are often invisible without external scanning.

Code Examples

✗ Vulnerable
# nginx — TLS misconfiguration:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;  # Should not include TLS 1.0/1.1
ssl_ciphers ALL;                          # Allows weak ciphers
# Missing: ssl_stapling on;
# Missing: ssl_session_cache
✓ Fixed
# nginx — secure TLS config:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
ssl_stapling on;
ssl_stapling_verify on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;

Added 15 Mar 2026
Edited 22 Mar 2026
Views 65
Rate this term
No ratings yet
🤖 AI Guestbook educational data only
| |
Last 30 days
0 pings T 0 pings W 1 ping T 0 pings F 0 pings S 0 pings S 0 pings M 1 ping T 0 pings W 0 pings T 3 pings F 3 pings S 6 pings S 4 pings M 0 pings T 2 pings W 0 pings T 1 ping F 0 pings S 0 pings S 0 pings M 0 pings T 1 ping W 0 pings T 1 ping F 0 pings S 1 ping S 1 ping M 0 pings T 0 pings W
No pings yet today
No pings yesterday
Scrapy 16 Amazonbot 7 Perplexity 7 Ahrefs 4 Bing 4 SEMrush 4 Unknown AI 2 Google 2 Claude 2 ChatGPT 2 Meta AI 1 PetalBot 1
crawler 48 crawler_json 4
DEV INTEL Tools & Severity
🟠 High ⚙ Fix effort: Low
⚡ Quick Fix
Enable TLS 1.3 in Nginx — it reduces the handshake to one round trip (vs two for TLS 1.2), improving TTFB by 50-100ms for new connections
📦 Applies To
any web
🔗 Prerequisites
🔍 Detection Hints
TLS 1.2 only when TLS 1.3 available; no session resumption; 0-RTT not enabled for returning clients
Auto-detectable: ✓ Yes ssllabs nginx-config openssl
⚠ Related Problems
🤖 AI Agent
Confidence: Medium False Positives: Medium ✗ Manual fix Fix: Medium Context: File
CWE-326 CWE-295


✓ schema.org compliant