Push-уведомление в PHP с использованием файла PEM
Я работал над учебными пособиями Рэя Вендерлиха по push-уведомлениям с использованием PHP-скрипта.
Ссылка: 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
Я провел массу исследований, но столкнулся с проблемой во второй части, где вы запускаете файл 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: ошибка 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
Я буквально повторил все. Я знаю, что мой пароль правильный. Я заново создал свои сертификаты, файлы pem и ключи. Ничего не работает Одна и та же ошибка каждый раз, когда я делаю это.
Я запутался.
У кого-нибудь есть предложения или знаете, что происходит?
Спасибо!
ОБНОВЛЕНИЕ 1:
Я также попытался установить полный путь к файлу ck.pem, который также не исправляет ошибку.
4 ответа
Хорошо, я наконец понял это! После 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');
Обновлено до 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',
]
]);
Обновление до MacOS Sierra 10.12.5
пожалуйста, добавьте
stream_context_set_option($ctx, 'ssl', 'verify_peer', false);
Проблема в новой версии PHP в macOS Sierra
Добавлять
stream_context_set_option($ctx, 'ssl', 'verify_peer', false);
который побеждает проверку сервера. Кредиты @One In Million Apps в комментарии выше.