Есть идеи, почему мой PayPal IPN Listener самопроизвольно начал выдавать ошибки? - PullRequest
1 голос
/ 19 февраля 2020

Начиная с субботы, я неожиданно получаю сообщение «Ошибка cURL: [60] Проблема с сертификатом SSL: невозможно получить сертификат локального эмитента» при срабатывании моего PayPal IPN. Я не менял код на своем сайте в течение нескольких месяцев, и, насколько мне известно, я не запускаю никаких автоматических обновлений, которые могли бы помешать.

Я прочитал десятки публикаций в стеке, но в них ничего нет работал. Я переместил .crt в другие каталоги и обновил cURLOPT_CAINFO. Перезапустил httpd и cpanel. Включенный сертификат в php .ini. (Этого не было до того, как это началось, поэтому я сомневаюсь, что это так.) Скачал и установил .pem файлы, которые, я думаю, даже не имеют к этому отношения. Ничего из этого не сработало.

PayPal проверил, что сообщения IPN отправляются, а песочница PayPal успешно провела квитирование. На сайте есть обычный старый SSL, и он работает правильно.

Сервер - GoDaddy VPS, CentOs Linux 7 с Apache 2.4.41.

Я не желает отключить VERIFYPEER или работать в небезопасной установке.

Мой код:

protected function curlPost($encoded_data)
    {
        $uri = 'https://'.$this->getPaypalHost().'/cgi-bin/webscr';
        $this->post_uri = $uri;

        $ch = curl_init();

        if ($this->verify_ssl) {
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
            curl_setopt($ch, CURLOPT_CAINFO, '/home/shopusa/public_html/app/Support/cert/api_cert_chain.crt');
        }

        curl_setopt($ch, CURLOPT_URL, $uri);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $encoded_data);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $this->follow_location);
        curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, true);

        $this->response = curl_exec($ch);
        $this->response_status = strval(curl_getinfo($ch, CURLINFO_HTTP_CODE));

        if ($this->response === false || $this->response_status == '0') {
            $errno = curl_errno($ch);
            $errstr = curl_error($ch);
            throw new Exception("cURL error: [$errno] $errstr");
        }

        return $this->response;
    }

Файл находится здесь, в соответствии с терминалом, и принадлежит владельцу веб-пользователь:

[root@ip-###-###-###-## cert]# cd /home/shopusa/public_html/app/Support/cert/
[root@ip-###-###-###-## cert]# ls
api_cert_chain.crt  _notes

Все права доступа - 755 / каталог и 644 / файл.

У кого-нибудь что-нибудь выпрыгивает? Я потратил на это около восьми часов, и у меня нет идей, как снова запустить прослушиватель IPN.

1 Ответ

0 голосов
/ 19 февраля 2020

Замените api_cert_chain.crt на обновленный пакет центра сертификации, который может проверить эмитента текущих криптографически безопасных сертификатов серверов PayPal.

Возможно от https://curl.haxx.se/docs/caextract.html (при необходимости конвертировать pem в crt, хотя я не думаю, что это так)

...