cURL error 60: SSL certificate problem: unable to get local issuer certificate
PHP cURL can't verify the server's certificate
Seen in PHP cURL, Guzzle, Laravel, Symfony HttpClient, WordPress, Composer
PHP cURL could not verify the server certificate, most often because PHP has no usable CA bundle.
Common causes
- PHP on Windows, or a custom build, ships without a CA bundle configured.
- The server omits its intermediate certificate.
- A corporate proxy re-signs HTTPS traffic with its own CA.
- Other variants name the problem directly, such as "certificate has expired" or "self-signed certificate".
How to fix it
- Download cacert.pem from curl.se/docs/caextract.html and set curl.cainfo and openssl.cafile to it in php.ini, then restart PHP.
- On Linux, install or update ca-certificates.
- If the server omits its intermediate, fix the server chain.
- Guzzle's 'verify' => false only hides the problem and is not a fix.
Got a different message? Paste it into the error explainer.
Related errors
- [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed · Python couldn't verify the server's certificate
- certificate verify failed: Hostname mismatch, certificate is not valid for · The certificate doesn't cover this hostname
- PKIX path building failed · Java can't build a trusted certificate chain
- javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure · The server rejected the TLS handshake
- No subject alternative DNS name matching example.com found · The certificate doesn't cover this hostname
- x509: certificate signed by unknown authority · Go doesn't trust the certificate's issuer
- x509: certificate is valid for X, not Y · The certificate doesn't cover this hostname
- remote error: tls: handshake failure · The server rejected the TLS handshake
- The SSL connection could not be established, see inner exception. · .NET could not complete the TLS handshake
- The remote certificate is invalid according to the validation procedure · .NET doesn't trust the server's certificate
- The request was aborted: Could not create SSL/TLS secure channel. · .NET Framework could not negotiate TLS
- stream_socket_enable_crypto(): SSL operation failed with code 1 · PHP failed to set up TLS on a stream