Erreurs SSL avec cURL et PHP

Diagnostiquez et corrigez les problemes SSL dans vos applications PHP.

Les erreurs SSL avec cURL sont parmi les plus frustrantes pour les developpeurs PHP. "SSL certificate problem: unable to get local issuer certificate" est le message classique.

Ces erreurs surviennent souvent apres une migration de serveur, une mise a jour PHP, ou lors de l'integration d'APIs tierces.

Ce guide couvre les causes et solutions pour les erreurs SSL cURL les plus courantes.

Erreurs Courantes

Les messages d'erreur SSL cURL typiques :

  • unable to get local issuer : le bundle de certificats racine n'est pas trouve ou configure.
  • certificate verify failed : le certificat du serveur ne peut pas etre verifie.
  • self signed certificate : le serveur utilise un certificat auto-signe non reconnu.
  • certificate has expired : le certificat du serveur distant a expire.

Causes Principales

Pourquoi ces erreurs surviennent :

  • Bundle CA manquant : PHP/cURL ne trouve pas le fichier cacert.pem.
  • Configuration PHP : curl.cainfo ou openssl.cafile non configure.
  • Serveur distant : chaine de certificats incomplete sur le serveur distant.
  • Proxy/Firewall : un proxy intercepte et modifie les connexions SSL.

Solutions

Comment resoudre ces erreurs :

  1. Telecharger le bundle CA : recuperez cacert.pem depuis curl.se.
  2. Configurer PHP : ajoutez le chemin dans php.ini.
  3. Tester la configuration : verifiez avec un script de test.
  4. Debugger si necessaire : utilisez CURLOPT_VERBOSE pour plus d'infos.

Solutions en Code

Corrections pour les erreurs SSL cURL :

<?php
// Solution 1: Specifier le bundle CA dans le code
$ch = curl_init("https://api.example.com");
curl_setopt($ch, CURLOPT_CAINFO, "/path/to/cacert.pem");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);

// Solution 2: Configurer dans php.ini
// curl.cainfo = "/path/to/cacert.pem"
// openssl.cafile = "/path/to/cacert.pem"

// MAUVAISE PRATIQUE - NE PAS FAIRE EN PRODUCTION
// curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

// Debug
curl_setopt($ch, CURLOPT_VERBOSE, true);
$verbose = fopen("php://temp", "w+");
curl_setopt($ch, CURLOPT_STDERR, $verbose);

Telecharger cacert.pem: https://curl.se/docs/caextract.html

Bonnes Pratiques

Evitez les pieges courants :

  • Jamais VERIFYPEER false : desactiver la verification SSL expose aux attaques MITM.
  • Mettez a jour le bundle : le bundle CA doit etre mis a jour regulierement.
  • Configurez globalement : configurez dans php.ini plutot que dans chaque script.
  • Testez en staging : verifiez les connexions SSL avant la production.

Checklist Debug

  • cacert.pem telecharge et a jour
  • php.ini configure
  • Chemin du bundle verifie
  • Serveur distant teste (chaine complete)
  • Proxy/firewall verifie
  • CURLOPT_VERBOSE active si besoin

Questions Frequentes

Puis-je desactiver la verification SSL ?

Uniquement en developpement. JAMAIS en production, cela expose aux attaques MITM.

Ou trouver cacert.pem ?

curl.se/docs/caextract.html - c'est le bundle officiel de Mozilla.

L'erreur vient du serveur distant ?

Possible. Testez avec SSL Labs s'il s'agit d'un serveur tiers.

Ca marchait et ca ne marche plus ?

Mise a jour PHP, changement de serveur, ou expiration de certificat distant.

Guzzle a le meme probleme ?

Oui, Guzzle utilise cURL. Meme solution : configurer le bundle CA.

Comment automatiser la mise a jour du bundle ?

Creez un cron qui telecharge cacert.pem periodiquement depuis curl.se.

SSL cURL Sans Douleur

Les erreurs SSL cURL sont resolues en configurant correctement le bundle de certificats CA. Ne jamais desactiver la verification.

Surveillez vos propres certificats avec MoniTao pour eviter d'etre la source du probleme pour vos clients.

Prêt à dormir sur vos deux oreilles ?

Commencez gratuitement, sans carte bancaire.