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

APNS + PHP "stream_socket_client(): Не удалось включить криптографию"

У меня возникли проблемы с использованием APNS с PHP и получением следующего сообщения:

stream_socket_client(): Failed to enable crypto

Проблема возникает только иногда, а в других случаях она действительно посылает push.

Так как у меня есть тест script на петле из 10 итераций, я иногда получаю это:

stream_socket_client(): SSL: Connection reset by peer

Я тестирую использование сервера песочницы tls://gateway.sandbox.push.apple.com:2195

Вот что я пробовал:

  • Я попытался переиздать PEM и все сертификаты с ним.
  • Я играл с протоколом запроса sslv3:// и tls://.
  • Я играл с парольной фразой (push работал без кодовой фразы)
  • Я попробовал поиск stackoverflow для решения и ничего не работал.
  • Проверяемые права на файл pem 644
  • Проверенные разрешения родительских каталогов pem 755

Кажется, что все решения, которые я нашел в Google и SO, - это люди, у которых проблемы с проблемой вообще.

Мне кажется, что услуга ограничена ставкой? Поскольку мы ждали некоторое время (около 15 минут), а затем снова попробовали его и смогли успешно нажать около 100 сообщений, пока я не начал получать это сообщение еще раз.

4b9b3361

Ответ 1

Сервис push sandbox ограничен скоростью. Я сам испытал это при тестировании, но никогда не сталкивался с такими ограничениями, используя производственный API.

Возможно, вы также столкнетесь с их другими защитами.

Вы открываете соединение, отправляете сообщение, закрываете соединение, а затем зацикливаете и делаете это снова и снова?

Это приведет к отключению ваших уведомлений. Apple хочет, чтобы вы отправляли несколько push-уведомлений с использованием одного и того же соединения, а не нового.

Рекомендации по управлению подключениями

Вы можете установить несколько подключений к одному шлюзу или к несколько экземпляров шлюза. Если вам нужно отправить большое количество удаленные уведомления, распространять их на соединения с несколькими разные шлюзы. Это повышает производительность по сравнению с использованием одно соединение: позволяет быстрее отправлять удаленные уведомления, и это позволяет APN доставлять их быстрее.

Держите свои соединения с APN открытыми для нескольких уведомлений; не повторно открывать и закрывать соединения. APN соединение и отключение в качестве атаки на отказ в обслуживании.. Вы должны оставьте соединение открытым, если вы не знаете, что он будет длительный период времени, например, если вы отправляете только уведомления ваши пользователи один раз в день нормально использовать новое соединение каждый день.

Из Apple Docs @https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html

Ответ 2

Мой PHP-код генерировал следующую ошибку:

PHP Warning:  stream_socket_client(): Failed to enable crypto in /private/tmp/t.php on line 12
PHP Warning:  stream_socket_client(): unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) in /private/tmp/t.php on line 12
PHP Warning:  fclose() expects parameter 1 to be resource, boolean given in /private/tmp/t.php on line 24

Проблема была, проклятый сертификат, истек позавчера!:-) Вы можете поверить в это?

Итак, мне нужно воссоздать мой файл PEM.

Ответ 3

Нет необходимости обновлять файл pem

эта ошибка возникает, если вы используете неверный PassPhrase

С уважением Эмилиано

Ответ 4

У меня была эта проблема. Исчезнул после предоставления разрешения на запись для "всех" для файла .pem.

Ответ 5

У меня есть эта проблема, потому что я глупо забыл включить расширение файла (.pem) при поставке пути к файлу для local_cert.

Ответ 6

несколько проверок:

  • токен устройства должен быть - без spaces и без < или >
  • убедитесь, что путь сертификата правильный и истек срок его действия.
  • убедитесь, что ключевая фраза, которую вы используете, является той, которую вы использовали для создания сертификата

Ответ 7

В моем случае проблема была в моем mac (OSX Sierra). Я загрузил php и cert на свой сервер, запустил его, и уведомление было доставлено.

Ответ 8

Я попробовал примеры из книги Марина Тодорова iOs 6 от Tutorials. И прежде чем я смог отправить push-уведомления для автоматического обновления, у меня была сильная головная боль из-за ошибки рукопожатия - stream_socket_client(): Failed to enable crypto.

Я сделал все, что нашел в Stackoverflow - изменил разрешения на сертификаты и другие.

Что я в итоге сделал?

Я создал собственный сертификат SSL и настроил Apache для обслуживания SSL.
Также я изменил протокол SSL с ssl на tls в имени хоста:

tls://gateway.push.apple.com:2195

После этого сервис работает.