Every certificate binds a public key to an identity, and is itself signed by the issuer's private key. Anyone can verify that signature with the issuer's matching public key — but only the issuer could have produced it, because only they hold the private half. Chain validation walks from the site's leaf certificate upward: each certificate's signature is recomputed and compared against the one it carries, and its stated issuer key must match the parent certificate's actual public key. The chain is trusted only if it terminates at a Root CA your browser already trusts.
valid(cert) = sign_hash(pubKey, issuerPubKey) == cert.signature
AND issuerPubKey == parent.pubKey
root is valid if sign_hash(pubKey, pubKey) == signature (self-signed anchor)
- Validate chain — click any certificate card (or this button for the leaf) to animate the walk from that certificate up to the Root CA, checking one signature per hop.
- Forge certificate — simulates an attacker swapping the leaf's public key without access to the Intermediate CA's private key. The old signature no longer matches the new data, so validation breaks exactly at that hop.
- Self-signed mode — a self-signed certificate's signature can still check out mathematically (it signs itself), but it isn't anchored to any Root CA your browser trusts, which is why browsers still flag it.
Real-world relevance: this is exactly the X.509 chain-building and signature-verification logic TLS clients run on every HTTPS connection before showing the padlock.