la validación del certificado de cURL con curlopt_cainfo no funciona

1

Quiero validar mi certificado SSL cada vez que ejecuto llamadas a la API. He estado siguiendo esta guía:

enlace

Este es mi código:

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://api-3t.sandbox.paypal.com/nvp");
curl_setopt($ch, CURLOPT_POSTFIELDS, ($apiCredentials . $nvpStr));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //Returnerar resultatet istället för att skriva ut det

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, curlopt_cainfo, (dirname(__FILE__) . '/cacert.pem'));

$response = curl_exec($ch);

El problema es que mi certificado SSL no está validado en absoluto, ¡parece que el archivo cacert.pem ni siquiera está verificado! He cambiado el nombre del archivo, lo he eliminado e incluso he intentado editarlo eliminando todos los certificados en el archivo cacert.pem que son de mi emisor de certificados. ¡La llamada a la API todavía se ejecuta sin importar qué!

¿Cuál podría ser el problema?

    
pregunta Marcus Edensky 10.06.2014 - 04:21
fuente

1 respuesta

2

Bastante simple :-)

En primer lugar, recibí algunos errores extraños cuando ejecuté tu script:

PHP Notice:  Use of undefined constant curlopt_cainfo - assumed 'curlopt_cainfo' in ...
PHP Warning:  curl_setopt() expects parameter 2 to be long, string given in ...

Así que reemplacé con curlopt_cainfo con CURLOPT_CAINFO , eso parece deshacerse de ellos.

Agregué lo siguiente después de curl_exec() call:

if (curl_errno($ch)) {
    echo 'Curl error: ' . curl_error($ch);
}

Cuando perdí el cacert.pem o la ruta no era válida, se mostró:

Curl error: Problem with the SSL CA cert (path? access rights?)

Después de que intenté piratear el certificado del sitio de PayPal como este (no NO haga esto en el entorno de producción):

openssl s_client -connect api-3t.sandbox.paypal.com:443 </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > cacert.pem

Se quejó de nuevo

Curl error: Peer certificate cannot be authenticated with known CA certificates

Después de proporcionar correctamente un paquete de certificados desde Mozilla:

wget http://curl.haxx.se/ca/cacert.pem -O cacert.pem 

Funciona bien :-)

No creo que tengas que proporcionar la opción CURLOPT_CAINFO , ya que curl viene con el cacert.pem de mozilla y esto debería funcionar de manera inmediata con solo CURLOPT_SSL_VERIFYPEER y CURLOPT_SSL_VERIFYHOST habilitados.

    
respondido por el lukash 22.08.2014 - 04:03
fuente

Lea otras preguntas en las etiquetas