python: APNs SSLError - PullRequest
       6

python: APNs SSLError

18 голосов
/ 29 апреля 2011

Я пытаюсь отправить push-уведомления на iPhone через python, как описано здесь , но получаю следующую ошибку:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/omat/CA/server/ca/models.py", line 193, in push
    c.connect((host_name, 2195))
  File "/usr/lib/python2.6/ssl.py", line 307, in connect
    self.ca_certs)
SSLError: [Errno 336265225] _ssl.c:337: error:140B0009:SSL routines:
  SSL_CTX_use_PrivateKey_file:PEM lib

Ошибка возникает изнутри модуля python ssl, как говорит traceback, но сообщение не поет мне. Есть идеи, что может быть не так?

Спасибо

Omat

редактирование:

Используемый сертификат создается из сертификата и закрытого ключа следующим образом:

openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12
openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12
cat apns-dev-cert.pem apns-dev-key.pem > apns-dev.pem

Ответы [ 2 ]

39 голосов
/ 02 мая 2011

Вот как я это работаю:

Изнутри KeyChain экспортируйте следующие данные в формате p12 без указания пароля:

  • Apple Development Push Services сертификат как cert.p12
  • primary key под Apple Development Push Services как pkey.p12

В терминале перейдите в каталог, куда вы экспортировали сертификаты, преобразуйте файлы p12 в формат pem и объедините их следующим образом:

$ openssl pkcs12 -in pkey.p12 -out pkey.pem -nodes -clcerts
$ openssl pkcs12 -in cert.p12 -out cert.pem -nodes -clcerts
$ cat cert.pem pkey.pem > iphone_ck.pem

iphone_ck.pem - это сертификат, который вам нужен.

13 голосов
/ 06 июля 2011

Я столкнулся с тем же сообщением об ошибке, используя PyAPNs .В примере написано, что нужно инициировать его следующим образом:

apns = APNs(use_sandbox=True, cert_file='cert.pem', key_file='key.pem')

Оказалось, что решением моей проблемы было включение полного системного пути для каждого файла .pem:

cert_path = os.path.join(os.path.dirname(__file__), 'cert.pem')
key_path = os.path.join(os.path.dirname(__file__), 'key.pem')
apns = APNs(use_sandbox=True, cert_file=cert_path, key_file=key_path)
...