Curl: problema con el certificado SSL, verifique que el certificado CA esté bien
07 de abril de 2006
Al abrir una url segura con Curl, puede obtener el siguiente error:
Problema con el certificado SSL, verifique que el certificado CA esté bien
Explicaré por qué el error y qué debes hacer al respecto.
La forma más fácil de deshacerse del error sería agregar las siguientes dos líneas a su secuencia de comandos. Esta solución plantea un riesgo de seguridad aunque.
//WARNING: this would prevent curl from detecting a 'man in the middle' attack
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
Veamos qué hacen estos dos parámetros. Citando el manual.
CURLOPT_SSL_VERIFYHOST : 1 para verificar la existencia de un nombre común en el certificado de igual SSL. 2 para verificar la existencia de un nombre común y también verificar que coincida con el nombre de host proporcionado.
CURLOPT_SSL_VERIFYPEER : FALSE para evitar que CURL verifique el certificado del par. Los certificados alternativos para verificar se pueden especificar con la opción CURLOPT_CAINFO o se puede especificar un directorio de certificados con la opción CURLOPT_CAPATH. CURLOPT_SSL_VERIFYHOST también puede necesitar ser VERDADERO o FALSO si CURLOPT_SSL_VERIFYPEER está deshabilitado (el valor predeterminado es 2). Establecer CURLOPT_SSL_VERIFYHOST en 2 (este es el valor predeterminado) garantizará que el certificado que se le presente tenga un 'nombre común' que coincida con la URN que está utilizando para acceder al recurso remoto. Este es un chequeo saludable pero no garantiza que su programa no esté siendo engañado.
Introduzca el 'hombre en el medio'
En su lugar, se podría confundir su programa para hablar con otro servidor. Esto se puede lograr a través de varios mecanismos, como dns o envenenamiento por arpa (esta es una historia para otro día). El intruso también puede auto-firmar un certificado con el mismo "nombre común" que su programa espera. La comunicación aún estaría encriptada, pero estarías revelando tus secretos a un impostor. Este tipo de ataque se llama 'hombre en el medio'
Derrotar al 'hombre en el medio'
Bueno, necesitamos verificar que el certificado que se nos presenta es bueno de verdad. Hacemos esto comparándolo con un certificado en el que confiamos * de manera razonable.
Si el recurso remoto está protegido por un certificado emitido por una de las principales entidades emisoras de certificados como Verisign, GeoTrust et al, puede comparar con seguridad con el paquete de certificados de CA de Mozilla que puede obtener de
http://curl.haxx.se/docs/caextract .html
Guarde el archivo cacert.pem
en algún lugar de su servidor y configure las siguientes opciones en su secuencia de comandos.
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");