Использование CURLOPT_CAINFO с обновленным пакетом CA приводит к сбою сертификата

Я использую cURL для проверки транзакций PayPal в плагине WordPress. Недавно я начал получать отчеты об ошибках о том, что пользователь не может завершить процесс покупки, потому что транзакция не может быть проверена. Я обнаружил ошибку:

SSL certificate problem, verify that the CA cert is OK. Details: 
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Я нашел много вопросов здесь, в StackOverflow, связанных с одной и той же проблемой, большинство из них сказали, что решение заключается в предоставлении пакета CA с использованием опции CURLOPT_CAINFO cURL. Я загрузил и в настоящее время поставляю с плагином самую последнюю версию (конвертированную 28 июня 2012 г.) из http://curl.haxx.se/ca/cacert.pem. Это решило большинство вопросов, которые я получил.

Проблема в том, что я только что получил еще один отчет о неудачных платежах, и ошибка была такой же: SSL certificate problem, verify that the CA cert is OK. , Интересная часть заключается в том, что теперь решение было удалить параметр CURLOPT_CAINFO. Мне интересно, есть ли в этом объяснения. Я думал, что использование обновленного пакета СА, такого как тот, который я загрузил, является общим решением, но похоже, что это иначе.

Каким будет общее решение для такого рода проблем? и что может объяснить, что использование обновленного пакета CA вызывает проблемы с сертификатом SSL, а не их исправление?.

Это конфигурация 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);
?>

ОБНОВЛЕНИЕ: сертификат на www.paypal.com подписан VeriSign. Иерархия сертификатов (как показано в Firefox):

  • VeriSign Class 3 Public Primary Certification Authority - G5
  • VeriSign Class 3 Extended Validation SSL CA
  • www.paypal.com

Я могу подтвердить сертификат для VeriSign Class 3 Public Primary Certification Authority - G5 включен в версию, которую я использую http://curl.haxx.se/ca/cacert.pem.

Спасибо за вашу помощь.

Ответ 1

Если у вас возникла эта проблема, пожалуйста, не отключите проверку сверстников и хостов, как кто-то предложил.

Это оставит ваши сообщения открытыми для потенциальных нападений "человек-в-середине", в первую очередь побеждая цель использования SSL.

Одно из возможных объяснений этой проблемы заключается в том, что настройка CURLOPT_CAINFO (особенно неправильного пути сертификата - я бы дважды CURLOPT_CAINFO проверку), переопределил путь по умолчанию на вашем сервере.

Как только вы удалите этот параметр, он вернется к своему стандарту (который может быть установлен в PHP).

Еще одна вещь, о которой нужно помнить, это то, что CURLOPT_CAINFO - это абсолютный путь.

Ответ 2

см. этот URL-адрес

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

или попробуйте

$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);