TLS Handshake
debt(d5/e3/b3/t5)
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.
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).
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.
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.
Also Known As
TL;DR
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
Why It Matters
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
# 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
# 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;