What a cert is · Chain of trust · How to get one · Where it lives · Lifecycle · First connection · How auth actually works · mTLS
Issued and cryptographically signed by a Certificate Authority your OS already trusts. Click each section below to expand.
openssl s_client -connect google.com:443 < /dev/nullYour OS ships with ~150 pre-installed Root CA certs. Every website's cert traces back to one of them. You never manually trust each site — you trust the root, which vouches for intermediates, which vouch for leaf certs.
Three ways to get a cert. All involve proving you control the domain, then getting a CA to sign your public key. Let's Encrypt automates the whole thing.
| Method | Process | When to use |
|---|---|---|
| Let's Encrypt (ACME) | certbot auto-renews every 60d. Domain proven via HTTP or DNS challenge. Free. | All public servers. Default choice. |
| Paid CA | Buy cert. Submit CSR. CA validates organisation. Manual. | EV/OV certs where org validation required. |
| Self-signed / Internal CA | You are the CA. Generate root, sign leaf certs. Install root on clients manually. | K8s internal mTLS, homelabs. Never public. |
Yes — you (or certbot/cert-manager) manually place cert files in specific directories. The server is configured to read them on startup. Here is exactly where everything goes and what each file is.
| Platform | Where roots are stored | Can you add custom roots? |
|---|---|---|
| macOS | Keychain Access → System Roots | Yes — drag cert into Keychain → set to Always Trust |
| Linux | /etc/ssl/certs/ — /usr/share/ca-certificates/ | Yes — copy to /usr/local/share/ca-certificates/ → update-ca-certificates |
| Windows | certmgr.msc → Trusted Root CAs | Yes — certmgr or Group Policy |
| iOS | Settings → General → About → Certificate Trust Settings | Yes — install profile via Settings → General → VPN and Device Management |
| Kubernetes pods | /etc/ssl/certs/ on node (inherited by pods) | Yes — inject custom CA via ConfigMap → mount into pod, or cert-manager CA injector |
The full life of a certificate — from key generation to revocation. If automation is correct, you never manually touch any of this.
| Days left | Action | Severity |
|---|---|---|
| 90 → 31 | Nothing. certbot will handle renewal automatically. | OK |
| 30 | Alert fires. Investigate if certbot hasn't renewed yet. | WARN |
| 7 | Page on-call. Something broken — manual intervention likely needed. | CRITICAL |
| 0 | Site down. Emergency: certbot renew --force-renewal + nginx reload. | INCIDENT |
| Key leaked | certbot revoke immediately. Re-issue with fresh key. Rotate all secrets that used this connection. | INCIDENT |
The key question: how does a client trust a server it has never spoken to before?
Answer: trust is pre-established through the OS trust store. The client trusts its OS manufacturer → who vetted the Root CAs → who verified domain ownership → who signed the server's cert. No prior relationship with the server needed.
Authentication is proving possession of the private key — without ever transmitting it. The server signs a hash of the handshake transcript. Client verifies with the cert's public key. Simple and elegant.
In regular TLS only the server authenticates. In mTLS both sides do. Used inside Kubernetes so services can't impersonate each other even if the cluster network is compromised.
spiffe://cluster.local/ns/default/sa/user-service| Aspect | TLS | mTLS |
|---|---|---|
| Server auth | ✓ | ✓ |
| Client auth | ✗ anonymous | ✓ cert required |
| Client needs cert | No | Yes |
| App code changes? | No | No — Envoy sidecar handles it |
| Use case | Public web | Service mesh, zero-trust |