Apple Push Notifications (APNs) для php-serverside-разработчика или Кто виноват при ошибке unable to connect to ssl://gateway.push.apple.com:2195 (Permission denied)

Недавно мое сражение с Apple Push Notifications (уведомлениями для iOS) продолжилось.

После переезда на новый сервер (с Debian на CentOS) уведомления перестали работать.

Далее речь пойдет о моём butheart'е при решении этой проблемы.

Итак php ошибка, которую я схлопотал сразу же после переезда:

stream_socket_client(): unable to connect to ssl://gateway.push.apple.com:2195 (Permission denied)

Ошибка говорящая, вполне очевидно, что соединение с сервером APN по порту 2195 не удалось устоновить, поскольку это запрещено.

Первая мысль которая возникла у меня (и должна возникнуть у вас, если такое произойдет с вами) — это firewall.

Firewall на сервере был и я посмотрел конфиг в /etc/sysconfig/iptables (хотя можно было и через Webmin как оказалось потом):

-A INPUT -p tcp --dport 2195 - J ACCEPT
-A OUTPUT -j ACCEPT // эта строка уже была прописана до меня

После внесения изменений я перезапустил firewall и apache:

[root]# service iptables restart
[root]# service httpd restart

Проверил APNs — без изменения, та же ошибка с Permission Denied. Беда-а.

Я поковырялся еще в поиске и решил отключить firewall напрочь на пару секунд:

[root]# service iptables stop

Та же ошибка в php, без изменений.

Я включил firewall обратно и продолжил поиск:

[root]# service iptables start

При этом push notifications вполне продолжали работать даже на моем локальном компе с тем же php-кодом и сертификатом. Я правда попытался закомментировать подключение сертификата в коде, но ситуации это не изменило — было понятно, что до самого сертификата дело вообще не доходит.

Очередная находка на просторах сети была связана с тем, как проверить открыт ли порт. И не смотря на то, что я уже безуспешно отключал firewall, я попробовал проверить, возможно ли установить соединение с нового production-сервера к Apple Push Notifications серверу по порту 2195 и 2196:

[root]# telnet gateway.push.apple.com 2195

На что получил справедливый ответ, говорящий об успешном подключении:

Trying 17.172.238.215
Connected to gateway.push.apple.com
Escape character is '^]'.

Я попробовал также и:

[root]# openssl s_client -connect gateway.push.apple.com:2195 -ssl3
[root]# openssl s_client -connect 17.172.238.222:2195 -ssl3

На каждый получил ответ от сервера.

Таким образом мой production-сервер подключался к APN-серверу без проблем, а вот из php подключение не удавалось. Значит проблема была либо в php, либо в apache.

Напомню, что сервер сменился:

Был Shared-хостинг на Debian с Apache и php5, стал выделенный CentOS с Apache и php5.

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

Это было вполне логично и безрезультатно. Конфиги были схожи и я не нашел ничего, что мне бы помогло.

После этого я сравнил еще вывод phpinfo(), но убедившись что поддержка openssl идентична и там, и там, оставил это.

Решение, которое мне помогло было найдено неожиданно на opennet.ru и состояло в одной единственной строчке настроек для apache, разрешающей сетевые соединения для процесса веб-сервера:

[root]# setsebool -P httpd_can_network_connect 1

 

И все заработало, как часы)

Полезно(2)Бесполезно(0)

Добавить комментарий