2011-04-29 7 views
18

Estoy tratando de enviar notificaciones push para iPhone a través de Python como se describe here pero estoy consiguiendo el error siguiente:pitón: APN SSLError

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 

El error se eleva desde el interior del módulo de Python ssl como dice el rastreo pero el mensaje no me canta. ¿Alguna idea sobre lo que podría estar mal?

Gracias,

Omat

edición:

El certificado utilizado se crea a partir del certificado y la clave privada de la siguiente manera:

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 
+0

posible duplicado de [Error al utilizar de httlib HTTPSConnection con certificado PKCS # 12] (http://stackoverflow.com/questions/2630011/error-using-httlibs-httpsconnection-with-pkcs12-certificate) – Daenyth

+0

Ambos certificados en este caso son certificados PEM – omat

Respuesta

39

Aquí es cómo consigo Está funcionando:

Desde dentro llavero de exportación se ejecutará tanto en p12 formato, sin dar la contraseña:

  • Apple Development Push Services certificado como cert.p12
  • primary key bajo Apple Development Push Services como pkey.p12

En el terminal vaya al directorio en el que ha exportado los certificados y convertir los archivos p12 al formato pem y concatenarlos de la siguiente manera:

$ 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 es el certificado que necesita.

+0

Tengo problemas similares, pero No puedo encontrar la clave principal en Apple Development Push Services, ¿cómo exactamente lo encontraste? Gracias por la gran respuesta por cierto. @omat – GangstaGraham

+0

Verifique el directorio de Llaves en Llaveros. Es una clave privada bajo el nombre que creó con su certificado CSR. – elliotrock

+0

En realidad, la forma de descubrir la clave privada es buscar en Xcode y ver qué es la Autoridad de firma de código: la clave privada coincidirá con esto. Además, cuando ejecute el comando openSSL, se le solicitará una contraseña; suponiendo que no especificó una en la exportación, solo haga clic en regresar. ¡Uf! ¡Esto finalmente me empujó a trabajar! –

13

Me encontré con el mismo mensaje de error usando PyAPNs. El ejemplo dice para iniciar de esta manera:

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

Resulta que la solución a mi problema era incluir la ruta completa del sistema para cada archivo .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) 
+0

Es realmente extraño, pero es la solución incluso cuando 'cert.pem' y' key.pem' se mantienen en la misma jerarquía de niveles, ¡buena respuesta! –