Intereting Posts
Конвертация PDF в PNG или JPEG очень медленная, используя ImageMagick используя кавычки без одинарных кавычек и двойные кавычки в значении $ _POST Сброс Infinite Scroll для отображения новых результатов, полученных через AJAX значение поиска многомерного массива и вернуть его ключ php Помощь PHP с сбросом пароля и истечением срока действия токена Уведомление в корзине Woocommerce, показывающее несколько раз Как добавить столбец в таблицу с использованием миграции laravel 5 без потери данных? java-скрипт Оповещения о выпуске Unicode в IE 8 Сделано поле поиска с полем, скрытым до выпадающего выделения. Многомерный массив в php SESSION Как добавить пользовательскую кнопку и ее функциональность в Admin Silverstripe? цвет изменения поля для jpgraph Шифрование Blowfish в php есть ли способ получить общие значения между двумя массивами в php? Получение пользовательского заголовка авторизации из входящего запроса PHP

Paypal Access – сертификат SSL: не удалось получить сертификат локального эмитента

Я работаю с cUrl и PHP, чтобы сделать запрос на сервер (для доступа в PayPal)

Веб-сайт разработчика Paypal никогда не упоминает, что для использования API доступа PayPal требуется сертификат SSL, однако код, который я использую для запроса токена, следующий:

$options = array( CURLOPT_URL => $url, CURLOPT_POST => 1, CURLOPT_VERBOSE => 1, CURLOPT_POSTFIELDS => $postvals, CURLOPT_RETURNTRANSFER => 1, CURLOPT_SSLVERSION => 3 ); curl_setopt_array($ch, $options); $response = curl_exec($ch); echo curl_error($ch); 

Это эхо выводит следующую ошибку:

 SSL certificate problem: unable to get local issuer certificate 

Мои вопросы:

1) Мне нужен SSL для использования PayPal-доступа, если мне нужно только получить электронную почту пользователя?

2) если мне не нужен SSL, почему эта ошибка возникает?

PS: конечная точка следующая: https://www.sandbox.paypal.com/webapps/auth/protocol/openidconnect/v1/tokenservice

Правильное решение – исправить вашу настройку PHP .. установка CURLOPT_SSL_VERIFYPEER на false – это быстрый взлом, но это неправильно, поскольку вы отключите проверку сертификата своим центром сертификации. Это подвергает вас нападению «человек в середине».

Его легко исправить ( php 5.3.7 или новее ). Загрузите файл списка с помощью современных органов сертификации и добавьте этот параметр в свой php.ini
curl.cainfo=<path-to>cacert.pem

Перезагрузите свой веб-сервер, и он будет работать!

Вы можете отключить проверку SSL (которая включена по умолчанию cURL 7.10), добавив следующее:

 CURLOPT_SSL_VERIFYPEER, false 

к вашим $options , однако правильным способом является сохранение проверки.

УВЕДОМЛЕНИЕ О БЕЗОПАСНОСТИ

Если удаленный сайт использует сертификат, выданный известным ЦС, но проверка еще не завершена, то, скорее всего, сертификат настроен неправильно на удаленном сервере (отсутствие промежуточных сертификатов и т. Д.). Кроме того, ваша система не знала о том, что используемый центр сертификации подписал целевой сертификат. В таком случае yo должен использовать curl.cainfo ( документацию ) php.ini чтобы указать на действительный файл PEM со всеми поддерживаемыми центрами сертификации – это сделает вашу установку правильной проверкой цепи эмитента.

Имейте в CURLOPT_SSL_VERIFYPEER что, установив CURLOPT_SSL_VERIFYPEER в значение false вы НЕ CURLOPT_SSL_VERIFYPEER проблему! Вы работаете над этим. Это все о безопасности, так что это хорошо, чтобы сделать это какое-то время, но развертывание этого на производстве не мудро, вежливо, так как вы станете открытыми для Man In The Middle Attack . Вы были предупреждены.

У меня была такая же точная проблема

 Can't connect to PayPal to validate IPN message: SSL certificate: unable to get local issuer certificate 

Я использовал образцы кода, сгенерированные в github paypal, найденные здесь (я использовал PHP): https://github.com/paypal/ipn-code-samples

Я загрузил оба сертификата и попробовал тестирование как от curl: http://curl.haxx.se/docs/caextract.html

Примерно через 2 часа тестирования (с использованием симулятора ipn paypal) и googling выяснилось, что paypal ipn не может быть протестирован на localhost , поэтому я нажал код в реальном времени и попробовал тестирование, но все равно получил ту же ошибку (даже с разрешениями, установленными на 777).

Когда я установил CURLOPT_SSL_VERIFYPEER, false , это сработало, но это приведет к тому, что вы получите сертификат ssl.

После snooping вокруг файлов моего сервера, я нашел файл curl-ca-bundle.crt в моей папке PHP. Я решил жестко CURLOPT_CAINFO в моем сценарии ipn paypal на этот путь. Это, наконец, сработало!

Я заметил, что этот более старый .crt-файл содержит некоторые сертификаты, которые не были в последнем .crt-файле с сайта curl. Это была куча сертификатов от verisign class 1, verisign class 2, verisign class 3 and verisign class 4 .

Вот полный список имен сертификатов, которые я добавил в файл .crt curl:

  • Verisign Class 1 Public Primary Certification Authority
  • Verisign Class 1 Public Primary Certification Authority – G2
  • Verisign Class 1 Public Primary Certification Authority – G3
  • Verisign Class 2 Public Primary Certification Authority – G2
  • Verisign Class 2 Public Primary Certification Authority – G3
  • Verisign Class 3 Public Primary Certification Authority
  • Verisign Class 4 Public Primary Certification Authority – G2

Это может иметь какое-то отношение к тому, что сказал @Andomar – сертификат verisign от PayPal не включен в список по умолчанию (по умолчанию я имею в виду список по умолчанию).

У меня не было времени отлаживать и точно определять, какой сертификат нужен, поэтому я включил их все.

Для тех, кто испытывает эту проблему в будущем, я предлагаю получить последние сертификаты от завитки и добавить один за другим сертификаты в списке выше, пока ошибка не исчезнет.

Вот ссылка на некоторые из этих сертификатов verisign (вам может потребоваться Google для других, не перечисленных): http://www.symantec.com/page.jsp?id=roots

Примечание *: Чтобы просмотреть текущие сертификаты PayPal, вы можете запустить эту команду в терминале:

 openssl s_client -connect paypal.com:443 -showcerts 

Если у кого-то есть более глубокое понимание этой проблемы, прокомментируйте, поскольку я потратил часы, чтобы понять все вышеизложенное.

Ошибка сертификата SSL: невозможно получить сертификат локального эмитента

Это означает, что cUrl не доверяет Verisign, центру сертификации, который поручает PayPal. Как отмечает Marc B, cUrl больше не доверяет ни одному сертификату.

Вы можете обойти проверку цепочки сертификатов с помощью опции:

 CURLOPT_SSL_VERIFYPEER => 0 

Чтобы прочитать, как настроить cUrl так, чтобы он доверял Verisign, прочитайте документацию cUrl .