M1 - TLS 1.2 - Error de conexión de PayPal Express NVP CURL # 35: error de conexión SSL

15

Tengo un entorno de desarrollo en un servidor antiguo que ejecuta curl 7.19.7.

Recientemente me di cuenta de que Paypal Express ya no funciona y está devolviendo un error "Unable to communicate with the PayPal gateway.".

Excavando en los registros de excepciones que puedes ver

exception 'Exception' with message 'PayPal NVP CURL connection error #35: SSL connect error' in /path/app/code/core/Mage/Paypal/Model/Api/Nvp.php:983
Stack trace:
#0 /path/app/code/core/Mage/Paypal/Model/Api/Nvp.php(616): Mage_Paypal_Model_Api_Nvp->call('SetExpressCheck...', Array)
#1 /path/app/code/core/Mage/Paypal/Model/Express/Checkout.php(381): Mage_Paypal_Model_Api_Nvp->callSetExpressCheckout()
#2 /path/app/code/core/Mage/Paypal/Controller/Express/Abstract.php(108): Mage_Paypal_Model_Express_Checkout->start('http://asdf...', 'http://asdf...', false)
#3 /path/app/code/core/Mage/Core/Controller/Varien/Action.php(418): Mage_Paypal_Controller_Express_Abstract->startAction()
#4 /path/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(254): Mage_Core_Controller_Varien_Action->dispatch('start')
#5 /path/app/code/core/Mage/Core/Controller/Varien/Front.php(172): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#6 /path/app/code/core/Mage/Core/Model/App.php(365): Mage_Core_Controller_Varien_Front->dispatch()
#7 /path/app/Mage.php(684): Mage_Core_Model_App->run(Array)
#8 /path/index.php(210): Mage::run('uk', 'store')

No sé si Paypal ha cambiado algo con su sandbox recientemente, pero fui a la URL api-3t.sandbox.paypal.com en SSLLabs y vi que el único protocolo que admiten es TLS 1.2.

Después de leer sobre la configuración de las versiones de protocolo en el manual de PHP , agregué de forma pirata lo siguiente

nano +194 lib/Varien/Http/Adapter/Curl.php

curl_setopt_array($this->_getResource(), $options);

+curl_setopt($this->_getResource(), CURLOPT_SSLVERSION, 6);

return $body;

¡Excelente! Después de un apache agraciado ahora puedo usar Paypal express. Sin embargo, no estoy contento de haber tenido que hackear el núcleo. Tampoco estoy contento de haber tenido que hackear el núcleo en un lugar específico en curllugar de Paypal.

¿Alguien tiene algún consejo sobre una forma correcta de solucionar este problema?

EDITAR:

Solo confirmando algunos hallazgos adicionales, esto no afecta a Paypal Standard en Magento ya que no parece usarse curldebajo del capó. Estábamos recibiendo falsos negativos en ciertas máquinas.

P: "¡Cómo puede funcionar esto! Curl no se conecta al sandbox en la línea de comando"

A: "Está usando el estándar de PayPal y no expreso, no usa curl

Luke Rodgers
fuente
Viejos rizos muertos ... PHP será el próximo problema. Actualice el sistema operativo en el servidor. Obtenga VirtualBox y ejecute máquinas virtuales, es mucho más fácil de esa manera. TLS está avanzando.
Fiasco Labs

Respuestas:

9

Tuvimos este mismo problema y lo solucionamos actualizando la biblioteca de curl de 7.19 a 7.40.

Ejecute el siguiente comando: curl -v -s https://api-3t.sandbox.paypal.com/nvp

Si recibe un error de conexión SSL, tiene el mismo problema que tuvimos.

Puede usar el siguiente enlace (respuesta # 3) para obtener instrucciones sobre cómo hacer esta actualización de la biblioteca de rizos: /programming/28495444/how-to-upgrade-php-curl-to-version-7- 36-0

También probamos un hack y funcionó, pero no estábamos contentos con una solución temporal.

Espero que esta información te ayude.

Lorenzo García
fuente
1
Después de un poco de rascarse la cabeza, recordamos reiniciar PHP fpm y luego todo comenzó a funcionar :) Gracias. Actualizar rizo es todo lo que se requería.
Luke Rodgers el
¿Hay alguna solución disponible para el alojamiento compartido?
Raks el
4

También me encontré con este error hoy. Agregar lo siguiente a la app/code/core/Mage/Paypal/Model/Api/Nvp.phplínea 945 es al menos hacer el cambio en el módulo Paypal Nvp en lugar de las bibliotecas.

 try {
        $http = new Varien_Http_Adapter_Curl();

+       $http->addOptions(array(CURLOPT_SSLVERSION => 6));

De acuerdo con la página del manual de las constantes de rizo , también puede usar la constante en CURL_SSLVERSION_TLSv1_2lugar de 6si tiene una versión de PHP> = 5.5.19 o 5.6.3.

Brian
fuente
¡Gracias por publicar este truco más específico de PayPal! Después de revisar las otras respuestas, resolvimos el problema actualizando curl. Afortunadamente, estábamos ejecutando una versión suficientemente moderna de php para que esto funcione :)
Luke Rodgers
Gran respuesta, simplemente no edite archivos principales. ¡Me gusta la referencia constante también!
Robbie Averill
4

De hecho, la caja de arena cambió la semana pasada para aceptar solo TLS 1.2. De mis pruebas, TLS 1.2 se activará automáticamente si está usando PHP 5.5.19+ y una versión de curl suficientemente reciente (estoy usando 7.29). También necesita OpenSSL 1.0.1+.

Como todavía estamos ejecutando 5.3, también hemos tenido que agregar el mismo truco al núcleo, pero dado que Magento aún reclama soporte para 5.3, probablemente podamos esperar una solución oficial pronto (especialmente porque estos cambios también afectarán los sistemas de producción de Paypal en Junio).

Referencia: https://devblog.paypal.com/upcoming-security-changes-notice/

Matt O
fuente
Afortunadamente, el servidor ejecutaba php 5.5.24, por lo que era necesario actualizar curl.
Luke Rodgers el