Android/OkHttp: javax.net.ssl.SSLPeerUnverifiedException: Certificate pinning failure! Peer certificate chain: sha256/... Pinned certificates for api.example.com
The app's pinned certificate/public-key hash does not match the one the server presented, so OkHttp blocked the request.
Certificate pinning failure!javax.net.ssl.SSLPeerUnverifiedException: Certificate pinning failure!Peer certificate chain: sha256/ Pinned certificates forCertificate pinning failure Peer certificate chainCertificatePinner failure Meaning
Pinning ties the app to specific keys. After a certificate renewal with a new key (or a CDN/proxy change) the old pin fails. Pin to the intermediate or use backup pins, rotate pins before expiry via an app update, and never test through intercepting proxies with pinning enabled.
Common causes
- Certificate rotated with a new key
- CDN/proxy changed the presented chain
- Intercepting proxy (Charles/mitmproxy) while pinned
- Wrong hash or host in CertificatePinner
- No backup pin configured
⚡ Quick fix
- Update the pin set to include current and next keys
- Pin intermediate CA public keys for resilience
- Print the actual chain hashes from the exception and compare
Detailed fix by platform
Android
- The exception lists
sha256/...for each presented cert; copy the right one intoCertificatePinner.Builder().add("api.example.com", "sha256/...")
How to diagnose
- Pins — Match presented hashes?
- Rotation — Key changed?
- Proxy — Intercepting?
🔧 Still not fixed?
Many errors look alike. If the steps above didn’t solve it, one of these is probably what you’re facing:
Similar errors
- AH01909: server certificate does NOT include an ID which matches the server name Apache: [ssl:warn] AH01909: example.com:443:0 server certificate does NOT include an ID which matches the server name
- CAA record forbids issuance Let's Encrypt/CA: CAA record for example.com prevents issuance
- gRPC: Ssl handshake failed / authentication handshake failed gRPC: rpc error: code = Unavailable desc = connection error: desc = "transport: authentication handshake failed: x509: certificate signed by unknown authority"
Most viewed in SSL / TLS
- NET::ERR_CERT_COMMON_NAME_INVALID NET::ERR_CERT_COMMON_NAME_INVALID: Your connection is not private (certificate is for a different domain)
- Challenge failed for domain Let’s Encrypt / Certbot: Challenge failed for domain example.com — Invalid response from http://example.com/.well-known/acme-challenge/x: 404
- no start line OpenSSL: unable to load certificate / PEM routines:get_name:no start line (key values mismatch)
Other ways to find it
Where this error sits
Origin: Network. Errors that are often confused with or caused by this one (click to open):
🧠 Still stuck? Analyze your error
Paste the full message, response headers or stack trace — we'll detect the platform and point to the most likely cause.
💬 What worked for others
No tips yet — did something else fix this for you?
Share what worked for you
Tips are checked by an editor before they appear. Links are removed.
Report a correction or suggest an improvement
Last updated 4 Nov 2026