Message d’erreur
SSL operation failed with code 1. OpenSSL Error messages:
Également affiché sous la forme
- Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:
PHP affiche l’avertissement sur deux lignes : « SSL operation failed with code 1. OpenSSL Error messages: », suivi de la ou des erreurs OpenSSL. Les builds liés à OpenSSL 1.1.1 affichent à la place « error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed ».
PHP streams (file_get_contents, fopen, stream_socket_client, SoapClient, mail libraries) — openssl stream wrapper
Ce que cela signifie
Un flux PHP (file_get_contents, fopen, SoapClient, stream_socket_client et les bibliothèques de messagerie ou FTP qui reposent sur eux) a échoué lors de son handshake TLS. Le code 1 correspond à l’erreur SSL_ERROR_SSL d’OpenSSL ; la raison réelle figure sur la ligne suivante, le plus souvent « error:0A000086:SSL routines::certificate verify failed ». PHP ajoute ensuite « Failed to enable crypto » et « Failed to open stream: operation failed », qui sont des conséquences, pas des causes.
Pourquoi cela se produit
L’AC du serveur n’est pas approuvée
fréquenteUne AC privée ou de proxy, ou un serveur qui omet son certificat intermédiaire.
Les flux PHP n’ont aucun fichier d’AC utilisable
fréquenteopenssl.cafile n’est pas défini sur des systèmes où le chemin par défaut d’OpenSSL ne mène à aucun fichier d’AC (Windows, images minimales).
Un échec lié au protocole ou à la suite de chiffrement
occasionnelleLorsque la deuxième ligne donne d’autres raisons (« unsupported protocol », « alert handshake failure »), le serveur et PHP n’ont aucune version de TLS ni aucune suite de chiffrement en commun.
Comment corriger l’erreur
- 1.
Lire la ligne OpenSSL qui suit
« certificate verify failed » oriente vers un problème de confiance ou de dates ; les erreurs de protocole orientent vers la configuration TLS du serveur.
text Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed <- trust/chain/date problem Warning: file_get_contents(): Failed to enable crypto <- consequence, not the cause - 2.
Définir openssl.cafile
Les flux PHP utilisent openssl.cafile (ou openssl.capath) ; ext-curl utilise curl.cainfo, définissez donc les deux.
ini ; php.ini — CA bundle for PHP streams (file_get_contents, SoapClient, stream_socket_client) openssl.cafile = "/etc/ssl/certs/ca-certificates.crt" - 3.
Transmettre une AC pour une seule requête
Un contexte de flux avec ssl.cafile fait confiance à une AC privée sans affaiblir la vérification pour le reste.
php // One request with a private CA; verification stays on $context = stream_context_create(['ssl' => [ 'cafile' => '/etc/ssl/private-ca/corp-root-ca.pem', 'verify_peer' => true, 'verify_peer_name' => true, ]]); $body = file_get_contents('https://api.example.com/', false, $context);