WIUNIX ACADEMY
TLS works in one client but fails in another: chain and SNI diagnosis
Page 2 of 2. Review the earlier steps and prerequisites before continuing.
YOUR SYSTEM. YOUR STEPS.
Where are you working?
Choose your OS and version. The prerequisites, commands and troubleshooting follow your environment.
USE YOUR OWN VALUES
Configure this tutorial
Set the example values for your environment; related explanations and copy panels update together. Never enter passwords, private keys or tokens. Values stay in this tab and are not sent to the server or share links. Check actual DNS, certificates and network policy before running commands.
Different IP addresses, domains or ports? Open the settings below, change the values and select “Apply to tutorial”, then copy the updated commands.
Set values for my environment4 editable values
LET’S BUILD
Read the selected leaf identity and lifetime
This pipeline extracts public leaf metadata for the selected SNI. Pipefail prevents a failed producer from being hidden by a successful consumer. Compare SANs, issuer, validity and SHA256 fingerprint with the intended deployment. A matching common name alone is not a substitute for hostname verification.
Authorized Linux terminal
set -o pipefail
timeout 15 openssl s_client -connect '203.0.113.10:443' -servername 'app.example.com' -showcerts </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates -ext subjectAltName -fingerprint -sha256The actual served leaf has the expected SAN and valid dates; fingerprint differences across nodes trigger per-node comparison.
LET’S BUILD
Use a no-SNI comparison only to identify virtual-host selection
If the strict named probe succeeds but a legacy client fails, compare the no-SNI leaf. This intentionally omits SNI and does not verify a hostname, so it is diagnostic output only. A different default certificate can explain an older client’s failure; the repair is correct client SNI or a deliberate supported endpoint, not accepting the wrong certificate.
Authorized Linux terminal
set -o pipefail
timeout 15 openssl s_client -connect '203.0.113.10:443' -noservername -showcerts </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -fingerprint -sha256A different default leaf explains selection behavior; it does not authorize disabling verification.
LET’S BUILD
Interpret stapling in the context of the issuing CA
Request a stapled OCSP response, but do not fail every deployment merely because none is supplied. Let’s Encrypt ended OCSP service in2025 and removed OCSP URLs from newly issued certificates; older blanket advice to enable stapling for every certificate is stale. Stapling status alone does not prove revocation freshness, full chain validity or every browser’s policy. Inspect the leaf extensions and actual CA documentation, including CRLs and any TLS Feature requirement.
Authorized Linux terminal
timeout 15 openssl s_client -connect '203.0.113.10:443' -servername 'app.example.com' -status -verify_hostname 'app.example.com' -verify_return_error </dev/nullRecord the stapling observation separately from the strict trust/name result and the CA’s actual revocation mechanism.
LET’S BUILD
Validate a known public chain offline when necessary
For a private PKI or a controlled comparison, obtain the leaf, intermediates and approved root bundle through your authenticated certificate-management channel. The filenames below are public certificate files in a new review directory, never private keys. This command tests the chosen material and explicit root, not what an endpoint currently serves. Do not promote an intermediate or a server leaf to a trust anchor to silence a failure.
For this controlled comparison, the trusted option disables the default CA file/path/store and uses only the supplied approved root bundle; it does not install that trust system-wide.
Authorized Linux terminal
openssl verify -purpose sslserver -verify_hostname 'app.example.com' -trusted approved-roots.pem -untrusted intermediates.pem leaf.pemAn OK result applies to the explicit input chain and root bundle; repeat the live strict probe after any approved server correction.
Repair the owning layer and repeat from a clean client
A wrong leaf calls for correct vhost/SNI binding or issuance; a missing intermediate calls for the proper server chain; an old client trust store calls for a supported update; an expired leaf calls for renewal and successful installation. Use the existing certificate/deployment procedure with its before copies. These read-only diagnostics need no rollback. If a change fails, restore the exact previously valid bundle and binding, not a bypass flag. Never upload private keys into a diagnostic website.
Acceptance is a matrix, not a green padlock
Repeat the strict named probe for every serving node and address family used by clients, then test the affected application’s actual TLS library with its supported trust. Record SNI, SAN, chain, expiry, trust-store version and fingerprint. This documented guide does not claim hands-on testing of all TLS clients, browser revocation behavior or your custom endpoint.
GO TO THE SOURCE
Official references
Each environment states how it was reviewed. A documentation review does not claim a hands-on test of every version.
- OpenSSL s_client verification and SNI
- OpenSSL offline certificate verification
- OpenSSL certificate fields
- Let’s Encrypt ended OCSP support
- curl resolve mapping
- OpenSSL explicit trust-anchor selection
- Ubuntu release/support lifecycle
- Debian releases and support
- Supported Rocky Linux releases
- AlmaLinux releases
- RHEL9 network security and OpenSSH
- RHEL10 network security