Intereting Posts
Массив столбчатого байта от PHP до .NET WCF Service Изображение в реальном времени из rrd-файла в PHP Сортировка многомерного массива с использованием PHP PHP-массив: count или sizeof? file_get_contents возвращает 403 запрещенных Используйте локальную переменную в preg_replace_callback – PHP Захват поисковых ключевых слов в php Как создать папку в Team Drive с помощью API Google? PHP preg_split удаляет запятые и завершающий пробел как использовать символ UTF8 в пути Адрес для Scandir php Кнопка «Назад браузера» перенаправляется на 1-ю страницу, пока она должна перейти на предыдущую посещенную страницу при использовании пейджинга Отображение данных двух таблиц на одной и той же веб-странице Ошибка внутреннего сервера Trigger 500 в PHP и отображение страницы с ошибкой Apache как получить бесплатное количество бесплатных апачей в php Как перенаправить весь веб-трафик на определенную страницу?

stream_socket_client (): невозможно подключиться к ssl: //gateway.sandbox.push.apple.com: 2195 (соединение отклонено)

Я сделал php-файл для отправки уведомлений пользователям Apple iphone. Он работает на другом сервере, но не работает на моем сервере. Я сделал файл .pem точно, а также открыл номер порта 2195,2196. Но все же его не работает. Пожалуйста, помогите мне, чтобы избавиться от этой проблемы. Вот мой PHP-код для отправки push-уведомления:

<?php // Put your device token here (without spaces): $deviceToken = 'f672c26cbfb279e45c1b66d0ddb738d8043c785d5bb8dd20a72d52ae88d4a604'; // Put your private key's passphrase here: $passphrase = 'pushchat'; // Put your alert message here: $message = 'Welcome in testing'; $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); // Open a connection to the APNS server $fp = stream_socket_client( 'ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); if (!$fp) exit("Failed to connect: $err $errstr" . PHP_EOL); echo 'Connected to APNS' . PHP_EOL; // Create the payload body $body['aps'] = array( 'alert' => $message, 'sound' => 'default' ); // Encode the payload as JSON $payload = json_encode($body); // Build the binary notification $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); if (!$result) echo 'Message not delivered' . PHP_EOL; else echo 'Message successfully delivered' . PHP_EOL; // Close the connection to the server fclose($fp); ?> 

Я нашел эту статью, имея те же проблемы, и моя проблема была на самом деле двумя проблемами и считала, что это может быть полезно здесь. Я на Ubuntu / Php 5.5

Проверьте свои сертификаты!

 prompt\#: openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert ./push-crt.pem -key ./push-key.pem -CApath ./entrust_root_certification_authority.pem 

Когда я нашел вышеуказанный тест, я понял, что мне не хватает сертификата корневого центра на моем сервере, пункт 1. Как только я запустил вышеописанное, и он сработал, я понял, что библиотека, которую я использовал, передавала только один файл, в том числе в пункте 2.

1. Корневой сертификат

На моем сервере у меня не было установлен правильный корневой сертификат, поэтому я не смог проверить свой файл PEM. Я доберусь до следующего. После того, как я нашел эту страницу [Где получить файл CTR CA-файла Entrust Root?] [1] Я проверил, и у меня такая же проблема. Я предполагаю, что вы d / l в свою домашнюю папку …

 prompt\#: sudo cp ~/entrust_root_certification_authority.pem /usr/local/share/ca-certificates/entrust_root_certification_authority.crt prompt\#: sudo update-ca-certificates 

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

2. Ваш файл PEM

Если вы используете библиотеку, такую ​​как моя, которая передает один файл, и вы прошли вышеуказанный тест, используя как ваш сертификат, так и ключ, вам необходимо объединить свой ключ и сертификат. Для меня, используя мои примеры имен выше push-crt.pem

 prompt\#: cat push-crt.pem > push.pem prompt\#: echo >> push.pem prompt\#: cat push-key.pem >> push.pem 

затем я использовал объединенную пару ключ / сертификат, и все начало работать.

Уф. Надеюсь, это поможет кому-то.

Попробуйте этот код и убедитесь, что ваш сертификат, упомянутый на пути к серверу, является особенно ck.pem

  $deviceToken = 'f672c26cbfb279e45c1b66d0ddb738d8043c785d5bb8dd20a72d52ae88d4a604'; // Put your private key's passphrase here: $passphrase = 'pushchat'; // Put your alert message here: $message = 'Hello'; //////////////////////////////////////////////////////////////////////////////// $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); // Open a connection to the APNS server $fp = stream_socket_client( 'ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); if (!$fp) exit("Failed to connect: $err $errstr" . PHP_EOL); echo 'Connected to APNS' . PHP_EOL; // Create the payload body $body['aps'] = array( 'alert' => $message, 'sound' => 'default' ); // Encode the payload as JSON $payload = json_encode($body); // Build the binary notification $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); if (!$result) { echo 'Message not delivered' . PHP_EOL; } else { echo 'Message successfully delivered' . PHP_EOL; } // Close the connection to the server fclose($fp); }