# Connector: TLS certificate (`tls`) **Purpose**: the certificate presented by a host — CA switches (Let's Encrypt → DigiCert…), SAN additions (a new product hostname on a shared cert is a leak of upcoming launches), renewals, key type/size, chain, negotiated protocol/cipher/ALPN, and expiry (`extra.daysToExpiry`, `expiring` when < 14 days). **Sensor URL**: `tls://host[:port]`. **Sensor type**: TLS, tier D. **Config**: `port?` (443), `servername?` (SNI). **Retrieval**: a raw TLS handshake with SNI and ALPN `h2, http/1.1`, `rejectUnauthorized: false` so that an invalid certificate is *observed* (`authorized: false`, `authorizationError`) instead of failing the check; no HTTP request is sent. 12 s timeout. The target goes through `assertUrlAllowed` first (SSRF policy). **Normalization**: JSON of the stable identity — subject, issuer, SANs (sorted), validFrom/To, key type and bits, issuer chain, protocol, ALPN, authorization. Serial and fingerprint are kept in `extra` only, so a routine renewal by the same CA with the same SANs changes validity dates (one small change) rather than everything. **Known quirks**: `getPeerCertificate(true)` returns the chain the server sent — cross-signed roots may appear or disappear depending on the edge node; Akamai/Cloudflare edges may present different certificates per PoP (SANs identical in practice). Servers requiring TLS 1.3-only or client certificates are reported with `authorized: false`. **Tests**: covered live by the validator. **Verified**: 2026-09-08 on 77 hosts (0 failures).