File_get_contents https SSL operation failed
BMPCreated with Sketch.BMPZIPCreated with Sketch.ZIPXLSCreated with Sketch.XLSTXTCreated with Sketch.TXTPPTCreated with Sketch.PPTPNGCreated with Sketch.PNGPDFCreated with Sketch.PDFJPGCreated with Sketch.JPGGIFCreated with Sketch.GIFDOCCreated with Sketch.DOC Error Created with Sketch.
question

File_get_contents https SSL operation failed

Par
NicolasG2
Créé le 2017-03-01 17:58:41 (edited on 2024-09-04 13:10:49) dans Hébergements Web

Bonjour,

J'ai un mutu perso2014, non migré en https.
Sur un script php, je fais un file_get_contents vers une url https (avec un context GET), et j'ai une erreur:

file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in /home/

Comment faire pour que çà fonctionne ? Ce script tourne très bien sur easyphp après avoir activé:
extension=php_openssl.dll
allow_url_fopen = On

Merci,


11 réponses ( Latest reply on 2019-08-28 16:17:25 Par
CorentinH1
)

Bonjour,

Le file gets contents est vers une url à toi ou à quelqu'un d'autre ?

As tu essayé l'environnement d'exécution stable ?
Car l'ancien environnement n'est pas à jour et certains sites qui ne supportent que les protocoles à jour donc si tu fais une requête depuis l'ancien environnement ça ne passe pas.

Merci,

l'url est vers un domaine externe
mon ovhconfig:
app.engine=phpcgi
app.engine.version=5.6
http.firewall=none
environment=production

Mille merci Buddy, it works !!!

:kissing:

```text Bonjour à tous,

Je remonte ce vieux sujet mais j'ai exactement le même problème. Cependant la solution proposée (passer l'environnement PHP en stable) ne résout pas le problème chez moi.

Pour résumer :
Lorsque j'utilise `file_get_contents` pour accéder à une ressource externe, j'obtiens une erreur avec certains site :

> file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

En configurant la requête sans vérification des paires comme ci-dessous, ça fonctionne mais c'est une https://stackoverflow.com/questions/26148701/file-get-contents-ssl-operation-failed-with-code-1-failed-to-enable-crypto?noredirect=1&lq=1 faille de sécurité.

$options = https://filerun.com/
"ssl" => [
"verify_peer"=>false,
"verify_peer_name"=>false
]
];

$file = file_get_contents("https://www.velib-metropole.fr/assets/static_files/images/ico_velo_elec_full.png", false, stream_context_create($options));


Ma configuration :

* OVH Mutualisé
* PHP 7.3, stable, moteur PHP, mode dév
* SSL Let's Encrypt
* Site configuré via .htaccess pour être toujours en HTTPS

**Quelqu'un a t il déjà rencontré ce problème ?** Je n'ai le problème que depuis ce matin ... Hier, j'ai passé le site en PHP 7.3 (précédemment 7.0) pour installer [FileRun dessus, c'est tout. Repasser en PHP 7.0 ne règle pas le problème. ```

```text > SSL routines:SSL3_GET_SERVER_CERTIFICATE
> Warning: file_get_contents(): Failed to enable crypto in /home/...

il semble que ssl3 pose souci avec fopen: https://stackoverflow.com/a/14078318

mais ssl3 devrait ne plus être utilisé
https://www.octopuce.fr/nouvelle-faille-de-securite-la-fin-de-sslv3-est-annoncee/
et TLS1.2 est possible
```text
nmap --script ssl-enum-ciphers -p 443 www.velib-metropole.fr | grep -i tlsv
| TLSv1.0:
| TLSv1.1:
| TLSv1.2:
``` ```

Merci pour ta réponse !

Pour tester, j'ai fait le code suivant en utilisant CURL avec un « User Agent » pour mettre de côté l'hypothèse que le site de Vélib (notre exemple) bloque les requêtes `file_get_contents()`. Je configure bien la requête pour qu'elle emploie TLS 1.2.

function get_data($url) {
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');

curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);

$data = curl_exec($ch);
echo 'Erreur Curl : ' . curl_error($ch);
curl_close($ch);
return $data;
}

$returned_content = get_data('https://www.1metropole.fr/assets/static_files/images/ico_velo_elec_full.png'metropole.fr/assets/static_files/images/ico_velo_elec_full.png');
echo $returned_content;

J’obtiens l'erreur suivante :
> SSL certificate problem: unable to get local issuer certificate

**Cela indiquerait que PHP n'arrive pas à trouver le bon certificat sur mon serveur ?** Est-ce qu'OVH n'aurait pas les certificats à jour ?

J'ai essayé de charger des certificats (http://curl.haxx.se/ca/cacert.pem) manuellement, via ces options. Pour rappel je suis en mutualisé :

$certificate = __DIR__ . "/cacert.pem";
curl_setopt($ch, CURLOPT_CAINFO, $certificate);
curl_setopt($ch, CURLOPT_CAPATH, $certificate);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);

Ca n'a pas d'effet ...

Une idée ? Le code fonctionne très bien (avec ou sans les certificats téléchargés) si je pointe vers Google.com, par exemple.

```text cet erreur ssl3, je l'ai testée aussi, ailleurs

sur mon pc, à jour debian 10:
```text
curl -sS -O https://www.velib-metropole.fr/assets/static_files/images/ico_velo_elec_full.png

curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
```

ce n'est pas ton serveur en cause ```

Donc si je te comprends bien, le problème vient de leur côté et on a pas trop de solution. Merci pour tes réponses en tout cas !

je le pense, mais c'est la première fois que je suis confronté à ça

Pour info, la connexion SSL fonctionne à nouveau parfaitement vers le site Vélib depuis une heure. Probablement un bug temporaire de leur côté. Ca m'apprendra à vouloir régler les problèmes, ils se résolvent tous seuls maintenant on dirait ...