Uso cURL para verificar las transacciones de PayPal en un complemento de WordPress. Recientemente empecé a recibir informes de errores sobre usuarios que no podían completar el proceso de compra porque no se pudo verificar la transacción. Localicé el error a:El uso de CURLOPT_CAINFO con el paquete de CA actualizado causa la verificación del certificado fallida
SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
me encontré con un montón de preguntas aquí en StackOverflow relacionado con el mismo problema, la mayoría de ellos dijo que la solución era proporcionar un haz de CA utilizando la opción CURLOPT_CAINFO
de rizo. Descargué y envío actualmente con el complemento la versión más reciente (convertida el 28 de junio de 2012) de http://curl.haxx.se/ca/cacert.pem. Eso resolvió la mayoría de los problemas que había recibido.
El problema ahora es que acabo de recibir otro informe de pagos fallidos y el error fue el mismo: SSL certificate problem, verify that the CA cert is OK.
. La parte interesante es que ahora la solución era eliminar la opción CURLOPT_CAINFO
. Me pregunto si hay una explicación para esto. Pensé que el uso de un paquete de CA actualizado, como el que descargué, era una solución general, pero parece ser de otra manera.
¿Cuál sería una solución general para este tipo de problema? y ¿qué podría explicar que usar el paquete de CA actualizado cause problemas con el certificado SSL, en lugar de solucionarlos?
Ésta es la configuartion cURL:
<?php
$ch = curl_init("https://www.paypal.com/cgi-bin/webscr");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem');
curl_setopt($ch, CURLOPT_POSTFIELDS, $content);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
?>
ACTUALIZACIÓN: El certificado para www.paypal.com está firmado por VeriSign. La jerarquía de certificados (como se muestra en Firefox) es:
- clase 3 de VeriSign Pública Autoridad de Certificación Primaria - G5
- clase 3 de VeriSign Extended Validation SSL CA
- www.paypal.com
Puedo confirmar el certificado para VeriSign Class 3 Public Primary Certification Authority - G5 está incluido en la versión que estoy usando de http://curl.haxx.se/ca/cacert.pem.
Gracias por su ayuda.
(¿Sigue teniendo este problema?) Para limitar la consulta: ¿Se está conectando a PayPal desde el mismo host para cada solicitud? Es decir, ¿el mismo código fuente, de la misma máquina, arrojará ocasionalmente este error? –
Perdón por la respuesta tardía. El código anterior es parte de un plugin de WordPress. Estaba viendo diferentes resultados con el mismo código fuente, pero diferentes máquinas. Algunos usuarios informaron problemas cuando se utilizó el paquete de certificados personalizados y otros informaron problemas cuando se utilizó el paquete predeterminado. Mi solución fue admitir ambos escenarios: probar con el paquete personalizado y repetir la solicitud sin él, en caso de error. –
Problema interesante. La solución que describes parece ser tu mejor opción. Sin el seguimiento de cada usuario de la versión php + curl, sería difícil aislar la causa: ¿se trata de un problema de permisos, una API heredada, un error histórico de php/curl, un host mal configurado? Demasiados factores Basta con decir que creo que preferir un paquete CA actualizado actualizado es una buena práctica y debería ser confiable para entornos php modernos bien configurados. –