Подтвердить что ты не робот

Push Notification в PHP с использованием файла PEM

Я работаю над учебниками Ray Wenderlich по push-уведомлениям с помощью PHP Script.

Ссылка: http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1

http://www.raywenderlich.com/32963/apple-push-notification-services-in-ios-6-tutorial-part-2

Я провел много исследований, но я столкнулся с проблемой на части 2, где вы запускаете файл push.php, используя файл ck.pem.

/Applications/XAMPP/bin/php push.php development

Моя единственная разница в том, что я использую XAMPP, а не MAMP.

Я подтвердил, что все расширения установлены.

Я могу проверить свой сертификат в терминале, выполнив следующее:

openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem

Он просит меня ввести кодовую фразу, и я это делаю. Все успешно работает в терминале.

Однако, когда я запускаю файл push.php, я получаю следующие ошибки:

Предупреждение PHP: stream_socket_client(): Ошибка операции SSL с кодом 1. Сообщения об ошибках OpenSSL: Ошибка: 14090086: SSL-процедуры: SSL3_GET_SERVER_CERTIFICATE: проверка сертификата не выполнена PHP Warning: stream_socket_client(): Не удалось включить криптографию в

Предупреждение PHP: stream_socket_client(): невозможно подключиться к ssl://gateway.sandbox.push.apple.com: 2195 (Неизвестная ошибка) в строке 140

Строка 140 в файле php:

$this->fp = stream_socket_client('ssl://' . $this->server, $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

Я нашел их:

Уведомление push iOS не работает при использовании планировщика crontab

https://devforums.apple.com/message/1054840#1054840

Push-уведомление в PHP

Я буквально повторил все. Я знаю, что моя кодовая фраза верна. Я повторно создал свои сертификаты, файлы pem и ключи. Ничего не работает. Такая же ошибка каждый раз, когда я это делаю.

Я не смущен.

Есть ли у кого-нибудь предложения или знать, что происходит?

Спасибо!

ОБНОВЛЕНИЕ 1:

Я также попытался установить полный путь к файлу ck.pem, который также не исправляет ошибку.

4b9b3361

Ответ 1

Хорошо, я, наконец, понял это! После 2 дней работы с этим.

Итак, для всех, кто сталкивается с этой проблемой:

Загрузите сертификат entrust_2048_ca.cer из: https://www.entrust.com/get-support/ssl-certificate-support/root-certificate-downloads/

Прокрутите вниз и получите Центр сертификации Entrust.net(2048)

Затем в файле push.php после установки контекста для ключевой фразы добавьте эту строку: stream_context_set_option($ctx, 'ssl', 'cafile', 'entrust_2048_ca.cer');

Ответ 2

Обновлено до macOS Sierra 10.12.4


Проблема заключается в новой версии PHP в macOS Sierra. Они изменили способ работы с сертификатами.

Я бы предложил небольшие изменения в принятом ответе, чтобы сделать вещи явными.

Вы должны установить путь на entrust_2048_ca.cer и другие параметры во время создания контекста потока, например

$streamContext = stream_context_create([
        'ssl' => [
            'verify_peer'      => true,
            'verify_peer_name' => true,
            'cafile'           => '/path/to/bundle/entrust_2048_ca.cer',
        ]
    ]);

Полное объяснение и ссылки здесь

Ответ 3

Обновление до macOS sierra 10.12.5

добавьте

stream_context_set_option($ctx, 'ssl', 'verify_peer', false);

Проблема заключается в новой версии PHP в macOS Sierra

Ответ 4

добавить

stream_context_set_option($ctx, 'ssl', 'verify_peer', false);

который побеждает проверку сервера. Кредиты @One В миллионах приложений в комментарии выше.