Prerequisites
- Target system, dependencies and environment configured.
Usage
Purpose
TLS protects data in transit — but only if it's configured well. Old protocol versions, weak cipher suites, and expired or misissued certificates leave connections vulnerable to downgrade, interception, and decryption. This skill covers inspecting a service's TLS from the outside to find those weaknesses, and the configuration that scores clean while staying usable. It's the wire-level check that complements the crypto domain's TLS-configuration guidance.
When to use it
Assessing any TLS-enabled service (HTTPS, mail, VPN, database over TLS, APIs), or verifying your own endpoints after a config change. Fast, non-intrusive, and high-signal — TLS misconfiguration is common and directly relevant to data-in-transit security.
Procedure
- Scan the endpoint's full TLS configuration. A dedicated tool enumerates supported protocols, cipher suites, certificate details, and known vulnerabilities in one pass:
testssl.sh https://example.com:443
# or
sslyze example.com:443
- Check protocol versions. Only TLS 1.2 and 1.3 should be enabled. SSLv2/SSLv3 and TLS 1.0/1.1 are deprecated and weak — their presence is a finding. TLS 1.3 is preferred where supported.
- Check cipher suites. Weak or obsolete ciphers (RC4, DES/3DES, export-grade, NULL, anything without forward secrecy) should be disabled. Prefer AEAD suites (AES-GCM, ChaCha20-Poly1305) with forward secrecy (ECDHE).
- Check the certificate. Valid (not expired, not self-signed for public services), correct hostname (matches the domain and SANs), trusted chain (complete, no missing intermediates), and a strong signature (SHA-256+, RSA-2048+/ECDSA). An expired or mismatched cert is a common, user-facing finding.
- Check for known TLS vulnerabilities the scanner flags — Heartbleed, ROBOT, weak DH parameters, insecure renegotiation, BEAST/POODLE (from old protocols). These map to specific misconfigurations to fix.
- Verify hardening extras — HSTS (from the security-headers skill) for web, OCSP stapling, and secure renegotiation.
Cheatsheet
testssl.sh https://example.com # thorough, human-readable, flags vulns
sslyze example.com:443 # fast, scriptable
nmap --script ssl-enum-ciphers -p 443 example.com # cipher/protocol enum
protocols TLS 1.2 + TLS 1.3 only (no SSLv2/3, no TLS 1.0/1.1)
ciphers AEAD (AES-GCM, ChaCha20-Poly1305) + forward secrecy (ECDHE)
NO RC4 / 3DES / DES / export / NULL / non-FS suites
cert valid dates, hostname matches SAN, trusted chain, SHA-256+, RSA-2048+
extras HSTS, OCSP stapling, secure renegotiation
known-vuln flags to act on
Heartbleed | ROBOT | weak DH | insecure renegotiation | BEAST/POODLE (old TLS)
Reading the output
- SSLv3 / TLS 1.0 / 1.1 enabled = deprecated protocols supporting downgrade and known attacks (POODLE, BEAST). Disable them — a clear finding.
- Weak ciphers offered (RC4, 3DES, export, NULL, non-forward-secret) = decryptable or interceptable connections; disable and keep only strong AEAD+FS suites.
- An expired, self-signed (for public), or hostname-mismatched certificate = a user-facing and trust-breaking finding; often also trains users to click through warnings.
- A flagged TLS vulnerability (Heartbleed, ROBOT, weak DH) = a specific, high-severity issue mapping to a concrete fix; prioritise these.
- No forward secrecy = past traffic is decryptable if the private key is ever compromised. Enable ECDHE suites.
- TLS 1.2+1.3 only, strong AEAD+FS ciphers, valid cert, no flagged vulns = the clean state.
The fix
- Disable old protocols — support only TLS 1.2 and 1.3; remove SSLv2/3 and TLS 1.0/1.1.
- Restrict to strong cipher suites with forward secrecy and AEAD (AES-GCM, ChaCha20-Poly1305); disable RC4, 3DES, export, and NULL. Use a current recommended cipher list rather than hand-picking.
- Fix the certificate — renew before expiry (automate it), ensure the chain is complete, the hostname/SANs match, and the signature is strong. Automate renewal to prevent the recurring "cert expired" outage.
- Address flagged vulnerabilities at their root (patch for Heartbleed, disable RSA key exchange for ROBOT, strong DH params).
- Add HSTS for web services and enable OCSP stapling and secure renegotiation.
- Re-scan after changes and monitor expiry continuously — TLS config drifts and certs expire on a clock.
Pitfalls
- Chasing a perfect score at the cost of compatibility. Disabling TLS 1.2 or all but the newest ciphers can break legitimate older clients; balance hardening against your actual client base (but old protocols like TLS 1.0/1.1 should still go).
- Letting certs expire. The most common, most embarrassing TLS incident — automate renewal and monitor expiry.
- Missing forward secrecy. A valid cert and modern protocol still leave past traffic decryptable without FS; require ECDHE.
- Checking only HTTPS. TLS protects mail, VPNs, databases, and APIs too — inspect all TLS services, not just the web server.
- One-time check. Config drifts and new vulnerabilities emerge; re-scan periodically.
References
- testssl.sh and SSLyze documentation
- Mozilla SSL Configuration Generator (recommended cipher lists)
- OWASP Transport Layer Protection Cheat Sheet
- The crypto-and-pki TLS-configuration skill and the security-headers (HSTS) skill
Inputs
- Relevant source code, logs, network traces, or system specifications.
Outputs
- Analysis findings, security audit report, or generated code artifacts.
1---2name: tls-inspection3description: Use when checking a service's TLS configuration on the wire — protocol versions, cipher suites, and certificate validity — to find weak crypto and misconfiguration.4---5678## Prerequisites9- Target system, dependencies and environment configured.1011## Usage12### Purpose1314TLS protects data in transit — but only if it's configured well. Old protocol versions, weak cipher suites, and expired or misissued certificates leave connections vulnerable to downgrade, interception, and decryption. This skill covers inspecting a service's TLS from the outside to find those weaknesses, and the configuration that scores clean while staying usable. It's the wire-level check that complements the crypto domain's TLS-configuration guidance.1516### When to use it1718Assessing any TLS-enabled service (HTTPS, mail, VPN, database over TLS, APIs), or verifying your own endpoints after a config change. Fast, non-intrusive, and high-signal — TLS misconfiguration is common and directly relevant to data-in-transit security.1920### Procedure21221. **Scan the endpoint's full TLS configuration.** A dedicated tool enumerates supported protocols, cipher suites, certificate details, and known vulnerabilities in one pass:23 ```24 testssl.sh https://example.com:44325 # or26 sslyze example.com:44327 ```282. **Check protocol versions.** Only TLS 1.2 and 1.3 should be enabled. SSLv2/SSLv3 and TLS 1.0/1.1 are deprecated and weak — their presence is a finding. TLS 1.3 is preferred where supported.293. **Check cipher suites.** Weak or obsolete ciphers (RC4, DES/3DES, export-grade, NULL, anything without forward secrecy) should be disabled. Prefer AEAD suites (AES-GCM, ChaCha20-Poly1305) with forward secrecy (ECDHE).304. **Check the certificate.** Valid (not expired, not self-signed for public services), correct hostname (matches the domain and SANs), trusted chain (complete, no missing intermediates), and a strong signature (SHA-256+, RSA-2048+/ECDSA). An expired or mismatched cert is a common, user-facing finding.315. **Check for known TLS vulnerabilities** the scanner flags — Heartbleed, ROBOT, weak DH parameters, insecure renegotiation, BEAST/POODLE (from old protocols). These map to specific misconfigurations to fix.326. **Verify hardening extras** — HSTS (from the security-headers skill) for web, OCSP stapling, and secure renegotiation.3334### Cheatsheet3536```bash37testssl.sh https://example.com # thorough, human-readable, flags vulns38sslyze example.com:443 # fast, scriptable39nmap --script ssl-enum-ciphers -p 443 example.com # cipher/protocol enum4041protocols TLS 1.2 + TLS 1.3 only (no SSLv2/3, no TLS 1.0/1.1)42ciphers AEAD (AES-GCM, ChaCha20-Poly1305) + forward secrecy (ECDHE)43 NO RC4 / 3DES / DES / export / NULL / non-FS suites44cert valid dates, hostname matches SAN, trusted chain, SHA-256+, RSA-2048+45extras HSTS, OCSP stapling, secure renegotiation4647known-vuln flags to act on48 Heartbleed | ROBOT | weak DH | insecure renegotiation | BEAST/POODLE (old TLS)49```5051### Reading the output5253- **SSLv3 / TLS 1.0 / 1.1 enabled** = deprecated protocols supporting downgrade and known attacks (POODLE, BEAST). Disable them — a clear finding.54- **Weak ciphers offered** (RC4, 3DES, export, NULL, non-forward-secret) = decryptable or interceptable connections; disable and keep only strong AEAD+FS suites.55- **An expired, self-signed (for public), or hostname-mismatched certificate** = a user-facing and trust-breaking finding; often also trains users to click through warnings.56- **A flagged TLS vulnerability** (Heartbleed, ROBOT, weak DH) = a specific, high-severity issue mapping to a concrete fix; prioritise these.57- **No forward secrecy** = past traffic is decryptable if the private key is ever compromised. Enable ECDHE suites.58- **TLS 1.2+1.3 only, strong AEAD+FS ciphers, valid cert, no flagged vulns** = the clean state.5960### The fix6162- **Disable old protocols** — support only TLS 1.2 and 1.3; remove SSLv2/3 and TLS 1.0/1.1.63- **Restrict to strong cipher suites** with forward secrecy and AEAD (AES-GCM, ChaCha20-Poly1305); disable RC4, 3DES, export, and NULL. Use a current recommended cipher list rather than hand-picking.64- **Fix the certificate** — renew before expiry (automate it), ensure the chain is complete, the hostname/SANs match, and the signature is strong. Automate renewal to prevent the recurring "cert expired" outage.65- **Address flagged vulnerabilities** at their root (patch for Heartbleed, disable RSA key exchange for ROBOT, strong DH params).66- **Add HSTS** for web services and enable OCSP stapling and secure renegotiation.67- **Re-scan after changes** and monitor expiry continuously — TLS config drifts and certs expire on a clock.6869### Pitfalls7071- **Chasing a perfect score at the cost of compatibility.** Disabling TLS 1.2 or all but the newest ciphers can break legitimate older clients; balance hardening against your actual client base (but old protocols like TLS 1.0/1.1 should still go).72- **Letting certs expire.** The most common, most embarrassing TLS incident — automate renewal and monitor expiry.73- **Missing forward secrecy.** A valid cert and modern protocol still leave past traffic decryptable without FS; require ECDHE.74- **Checking only HTTPS.** TLS protects mail, VPNs, databases, and APIs too — inspect all TLS services, not just the web server.75- **One-time check.** Config drifts and new vulnerabilities emerge; re-scan periodically.7677### References7879- testssl.sh and SSLyze documentation80- Mozilla SSL Configuration Generator (recommended cipher lists)81- OWASP Transport Layer Protection Cheat Sheet82- The crypto-and-pki TLS-configuration skill and the security-headers (HSTS) skill8384## Inputs85- Relevant source code, logs, network traces, or system specifications.8687## Outputs88- Analysis findings, security audit report, or generated code artifacts.