Escenario
Todo empezó con el aviso de un proveedor. Un plugin de WordPress fallaba con el siguiente error:cURL error 60: SSL certificate problem: unable to get local issuer certificate
Problema
Una búsqueda rápida con Google me lleva a la conclusión de que hay que editar el fichero de configuración php.ini. A fin de averiguar donde se encuentra el fichero en cuestión me sirvo del comando php -i | grep "Loaded Configuration File", que devuelve la siguiente información:Loaded Configuration File => /etc/php/7.4/cli/php.iniA continuación descargo http://curl.haxx.se/ca/cacert.pem y lo guardo en /etc/ssl/certs/. Edito los ficheros /etc/php/7.4/cli/php.ini y /etc/php/7.4/fpm/php.ini y añado/completo las siguientes directrices:
1 2 |
curl.cainfo="/etc/ssl/certs/cacert.pem" openssl.cafile="/etc/ssl/certs/cacert.pem" |
Solución
Me huelo que el problema va a estar relacionado con la cadena de confianza de certificado SSL del sitio web. Un openssl s_client -connect acme.com:443 me lo confirma:CONNECTED(00000003)El servidor web —en este caso nginx— no está devolviendo la cadena entera del certificado. La solución pasa por editar el certificado referenciado en la clave ssl_certificate del fichero de configuración del sitio /etc/nginx/sites-enabled/acme.com y añadir los certificados que completan la cadena. Para este sitio usamos Sectigo (antes conocido como Comodo). Los certificados los entrega en dos ficheros:
depth=0 CN = *.acme.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = *.acme.com
verify error:num=21:unable to verify the first certificate
verify return:1
- STAR_acme_com.crt
- STAR_acme_com.ca-bundle