PyAPNs выбрасывает операцию IOError, не поддерживаемую устройством

Я пытаюсь реализовать APNS для моего приложения iOS push из этого урока raywenderlich.

Согласно описанию я все сделал. После запуска этой команды openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem

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

У меня сейчас два файла PushChatCert.pem а также PushChatKey.pemа также token_hex = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

Так что для отправки push-уведомлений с сервера я следил за PyAPN.

После всего этого в моей оболочке Python IOError: [Errno 19] Operation not supported by device

import time
from apns import APNs, Frame, Payload
apns = APNs(use_sandbox=True, cert_file='PushChatCert.pem', key_file='PushChatKey.pem')

# Send a notification
token_hex = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
payload = Payload(alert="Hello World!", sound="default", badge=1)
apns.gateway_server.send_notification(token_hex, payload)

ошибка

Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    apns.gateway_server.send_notification(token_hex, payload)
  File "/Library/Python/2.7/site-packages/apns.py", line 544, in send_notification
    self.write(self._get_notification(token_hex, payload))
  File "/Library/Python/2.7/site-packages/apns.py", line 273, in write
    return self._connection().write(string)
  File "/Library/Python/2.7/site-packages/apns.py", line 254, in _connection
    self._connect()
  File "/Library/Python/2.7/site-packages/apns.py", line 230, in _connect
    self._ssl = wrap_socket(self._socket, self.key_file, self.cert_file)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 891, in wrap_socket
    ciphers=ciphers)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 509, in __init__
    self._context.load_cert_chain(certfile, keyfile)
IOError: [Errno 19] Operation not supported by device

Редактировать:

После запуска этого комментария в моем терминале openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem Я получил вопрос о доверии следующим

depth=1 /C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C verify error:num=20:unable to get local issuer certificate

Итак, я скачал entrust_2048_ca.cer файл и хранится в той же папке, то из терминала я работаю как

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

Тогда эта проблема была решена, но как выполнить это в PyAPNs?

1 ответ

Решение

Проблема была решена. Это была некоторая проблема безопасности SSL для этого питона, который не мог получить доступ к файлам из этого каталога.

Я следовал этому уроку Apple-Push-Notification Services. Как описано в этом уроке после создания aps_development.cer файл, который я делал, чтобы получить файлы.pem

$ openssl x509 -in aps_development.cer -inform der -out PushChatCert.pem

Convert the private key’s .p12 file into a .pem file:

$ openssl pkcs12 -nocerts -out PushChatKey.pem -in PushChatKey.p12
Enter Import Password: 
MAC verified OK
Enter PEM pass phrase: 
Verifying - Enter PEM pass phrase:

После всего, что у меня было PushChatKey.pem а также PushChatCert.pem файлы и с помощью этих файлов я не смог отправить push-уведомления на мое устройство PyAPNs

apns = APNs(use_sandbox=True, cert_file='PushChatKey.pem', key_file='PushChatCert.pem')

Как я решил?

Наконец, я попытался создать сертификат с самого начала, но на этот раз, следуя другому руководству

Создайте свои сертификаты APNS.

После создания сертификата SSL, который вы загружаете как aps_developer_identity.cer, Дважды щелкните по нему, чтобы установить его в приложении Keychain Access. Сертификат SSL будет использоваться приложением вашего провайдера, чтобы он мог связаться с APN для отправки push-уведомлений вашим приложениям.

Запустите Keychain Assistant с вашего локального Mac и из цепочки для ключей 'login', отфильтруйте по категории 'Certificates'. Вы увидите расширяемую опцию под названием "Apple Development iOS Push Services":

Разверните эту опцию, затем щелкните правой кнопкой мыши "Apple Development iOS Push Services" -> "Экспорт Apple Development iOS Push Services ...". Сохранить это как apns-dev-cert.p12 файл где-то вы можете получить к нему доступ.

Теперь из apns-dev-cert.p12 вы делаете.pem, используя эти команды из вашего терминала

openssl pkcs12 -in apns-dev-cert.p12 -out apns.crt.pem -clcerts -nokeys
openssl pkcs12 -in apns-dev-cert.p12 -out apns.key.pem -nocerts -nodes

Если вы хотите создать single .pem

openssl pkcs12 -in apns-dev-cert.p12 -out apns_development.pem -nodes -clcerts

Теперь используйте эти apns.crt.pem а также apns.key.pem файлы с PyAPNs, и это работает как по волшебству.

Создайте свой provision profile внимательно.

Благодарю.

Другие вопросы по тегам