Envío de notificación de iOS a través de un script php: 'No se puede establecer el file de key privada'

He utilizado el script php del conocido tutorial de Ray Wanderlich para enviar notifications push durante la fase de desarrollo. Se activaron correctamente después de haber creado el file pem (del file p12 y aps_development.cer) y mencioné el token del dispositivo en el script php.

Sin embargo, cuando estoy usando un file pem que tiene un file de producción p12 y aps_production.cer, la notificación ni siquiera llega al server APNS. Se muestra el siguiente error en el server local final.

Unable to set private key file `/Users/administrator/Desktop/SimplePush/ck.pem' in /Users/administrator/Desktop/SimplePush/simplepush.php on line 22 Warning: stream_socket_client(): failed to create an SSL handle in /Users/administrator/Desktop/SimplePush/simplepush.php on line 22 Warning: stream_socket_client(): Failed to enable crypto in /Users/administrator/Desktop/SimplePush/simplepush.php on line 22 Warning: stream_socket_client(): unable to connect to ssl://gateway.push.apple.com:2195 (Unknown error) in /Users/administrator/Desktop/SimplePush/simplepush.php on line 22 

¿Cuál podría ser el motivo? El file p12 no tiene ninguna contraseña (aunque he configurado una contraseña para el file pem) y así se lo proporcionó en el script php.

 // Put your private key's passphrase here: $passphrase = ''; 

No fue el file p12 correcto. Exporté el file p12 correcto de Keychain y salió bien.

Lecciones aprendidas –

  1. Si los files p12 y cer que está utilizando no se corresponden entre sí, obviamente no habría ningún error mostrado durante la creación concatenada del file pem. Pero cuando ejecute el script, se mostrará un error.

  2. Los posts de error anteriores no implican necesariamente que la frase de contraseña del file p12 sea incorrecta. También pueden significar que el file p12 no corresponde al file cer usado.

Establecer $passphrase = '1234' a $passphrase = "1234" solucionó el problema para mí.

Si el file ck.pem existe en esa location, es posible que el script php no tenga acceso a él. Cambiaría los permissions de la carpeta / files a algo más indulgente o intentaría ejecutar la secuencia de commands como superusuario:

 sudo php simplepush.php 

Editar 1:

Después de un poco de investigación, parece que el file pem podría estar en un formatting inesperado. Puede intentar cambiar el order de los certificates que se combinaron en el file. También puede intentar usar files separados y especificar cada file utilizando las funciones 'stream_context_set_option'.

Editar 2:

Si puede, intente configurar las passwords para sus files de producción de la misma manera que el tutorial. Es posible que la frase de contraseña sea necesaria para que funcione. Una vez más, parece que algo está mal con el file pem, ya sea generado incorrectamente, faltante o en el formatting incorrecto. Compruebe el file. Tal vez incluso publicarlo en su pregunta si no es un riesgo para la security. Probablemente solo puedas regenerar una nueva key después de averiguar qué está mal.

si ejecuta el file desde la línea de command, quizás trate de dar la ruta completa al file ck.pem

cambie la línea: stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');

a

stream_context_set_option($ctx, 'ssl', 'local_cert', '/path/to/your/file/ck.pem');

trabaja para mi

Tengo el mismo error.

Estoy seguro de que mi file pem es correcto, sigo esta guía: https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ProvisioningDevelopment.html

depuró mucho y me di count de que olvidé la frase de contraseña.

PS: Utilicé este script php: https://github.com/duccio/ApnsPHP , tal vez te sea útil.

He encontrado el mismo problema, estoy usando 1234 como frase de contraseña. En lugar de escribir $ passphrase = '1234'; He escrito como $ passphrase = 1234; y está funcionando bien

Asegúrese siempre de no utilizar códigos antiguos de APNS (por ejemplo, está utilizando la misma tabla de database para su aplicación de desarrollo y producción). Esto hace que el service Apple APNS se desconecte porque recibió un código APNS no válido, ya que se usa un código APNS diferente para el desarrollo y la aplicación publicada.

Otro comentario: no olvide regenerar el par de keys si publica su aplicación en la tienda de aplicaciones. ¡Un certificate de desarrollo no funcionará en producción!