A capture of HTTPS traffic is often dismissed as unreadable. That is only half true. The payload is encrypted; the negotiation is not, and the negotiation is where most failures live.
TLS 1.2: the certificate is in the clear
ClientHello SNI, supported versions, cipher suites, key share
ServerHello chosen cipher, session ID
Certificate the server's chain — readable
ServerKeyExchange / ServerHelloDone
ClientKeyExchange, ChangeCipherSpec, Finished
In 1.2 an observer sees the hostname (SNI), the certificate, and the negotiated cipher. That is enough to answer "which site," "is the certificate expired," and "did the server reject the protocol."
TLS 1.3: everything after the hello is encrypted
ClientHello SNI, key share, supported versions
ServerHello chosen key share
{EncryptedExtensions, Certificate, CertificateVerify, Finished}
The certificate is now inside the encrypted handshake. SNI is still plaintext unless Encrypted Client Hello is in use, which is rare in enterprise networks.
So in 1.3 you can still see which hostname was requested, and whether the server answered at all. You cannot see the certificate without keys.
| Question | 1.2 | 1.3 |
|---|---|---|
| Which hostname? | SNI | SNI (unless ECH) |
| Which certificate? | Visible | Hidden |
| Cipher negotiated? | Visible | Visible |
| HTTP content? | No | No |
QUIC: UDP 443
QUIC is TLS 1.3 inside UDP, with its own connection IDs and its own handshake. It exists because TCP head-of-line blocking hurts on lossy links, and because browsers wanted to own the transport.
What a capture shows:
- UDP 443 between client and server.
- An Initial packet with a QUIC header and, inside it, the TLS ClientHello — including SNI, unless ECH.
- Connection IDs that survive address changes, which is why a phone can move from Wi-Fi to cellular without dropping a video.
What it does not show: anything after the handshake, and nothing at all if the traffic is ECH-wrapped.
If you inspect TCP 443 and allow QUIC, you inspect nothing
A proxy or firewall that only handles TCP will be bypassed by any browser using HTTP/3. Either block UDP 443 at the edge, or accept that this traffic is uninspected and document it. Half-measures produce reports that look complete and are not.
Filters worth knowing
tls.handshake.type == 1 ClientHello
tls.handshake.extensions_server_name SNI values
tls.alert_message handshake failures
quic all QUIC
udp.port == 443 QUIC by port
tcp.flags.reset == 1 && tcp.port == 443 resets on HTTPS
Reading a failure
ClientHello with no ServerHello. The server or something in front of it dropped the connection. Check policy, SNI-based blocking, and MTU.
ServerHello followed by an alert. The handshake failed after negotiation: protocol version, cipher mismatch, or certificate rejection. The alert code names the reason (40 handshake failure, 42 bad certificate, 70 protocol version).
Certificate visible and expired (1.2). The client will usually refuse. In 1.3 you will see the alert but not the certificate, so check the server directly.
Repeated ClientHello with different SNI. A client retrying after a block, or a proxy rewriting the name. Worth understanding before you assume the user typed the wrong URL.
Worked example: the site that loads for everyone but one VLAN
- Capture at the gateway, filter
tls.handshake.type == 1. - The ClientHello leaves with the correct SNI.
- No ServerHello returns, but the TCP handshake completed.
- A capture outside the firewall shows the ServerHello arriving at the edge and not leaving.
- The egress policy is blocking by SNI category, and this VLAN's policy differs from the others.
The capture did not decrypt anything. It located the drop, which is the point.
What breaks in production
- Assuming you can see URLs. You cannot, even with TLS 1.2.
- Forgetting QUIC. A capture filtered to TCP misses a growing share of web traffic.
- Expecting certificates in 1.3. They are encrypted; use
openssl s_clientagainst the host. - Decrypting without a lawful basis. SSL key logging requires access to the client or server; in a district, that is a policy decision, not a troubleshooting shortcut.
- ECH. When it is deployed, even the hostname disappears; treat it as opaque and rely on endpoint telemetry.
Checklist
- You know which TLS version the failing flow negotiated.
- SNI is checked before assuming the destination.
- UDP 443 is either captured or explicitly blocked.
- Alerts are read as codes, not as "TLS error."
- Decryption is a documented policy decision, never an ad-hoc step.
Next
Individual patterns are useful. Continue with Five Patterns That Explain Most Tickets, which combines them into a triage method.