2012-09-06 19 views
13

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.

+0

(¿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? –

+0

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. –

+0

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. –

Respuesta

3

ver esta url

http://davidwalsh.name/php-ssl-curl-error

o probarlo

$ch = curl_init(); 
curl_setopt($ch,CURLOPT_URL,'https://thirdparty.com/token.php'); //not the actual site 
curl_setopt($ch,CURLOPT_TIMEOUT,60); 
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch,CURLOPT_POST,1); 
curl_setopt($ch,CURLOPT_POSTFIELDS,'customer_id='.$cid.'&password='.$pass); 
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,true); 
curl_setopt($ch,CURLOPT_CAINFO,'mozilla.pem'); /* fixed! */ 
$result = curl_exec($ch); 
if(empty($result)) { /* error: nothing returned */ } else { /* success! */ } 
curl_close($ch); 
+2

Tx @AbidHussain, creo que mozzila.pem es el mismo archivo que estoy usando con un nombre diferente. Usar ese paquete solucionó el problema en la mayoría de los casos que he visto, pero también rompe las cosas para otros usuarios. Que es lo que trato de entender ahora. –

11

Si tiene este problema, por favor, no desactivar pares y verificación de acogida como alguien ha sugerido .

Esto dejará sus comunicaciones abiertas a posibles ataques de hombre en el medio, derrotando el propósito de usar SSL en primer lugar.

Una posible explicación para este problema es que el establecimiento de su CURLOPT_CAINFO (especialmente a una ruta de certificado incorrecto - Me doble-doble comprobación de esto) pasó por encima de la ruta predeterminada en el servidor.

Una vez que eliminó la configuración, volvió a su valor predeterminado (que se puede establecer en PHP).

Otra cosa a tener en cuenta es que CURLOPT_CAINFO es una ruta absoluta.

+0

Gracias @Tim_K. Todavía estoy usando la verificación de pares y host. En aquel entonces estaba trabajando en un plugin de WordPress y solo había unos pocos hosts que mostraban problemas de SSL ** después de ** Introduje el paquete de certificados personalizados. Nunca pensé el motivo; ya que la mayoría de los otros hosts estaban trabajando. Terminé haciendo las solicitudes utilizando el paquete de certificados personalizados y recurriendo a la configuración predeterminada (eliminando la configuración 'CURLOPT_CAINFO') si aparecían problemas. –

+0

+1 para la ruta absoluta –

Cuestiones relacionadas