Notificaciones push de APN con macOS Sierra

Estoy intentando enviar a mi teléfono una notificación de inserción utilizando la sencilla herramienta PHP que se conecta a ssl://gateway.push.apple.com:2195 , pero la connection falla con los siguientes errores:

 Warning: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in <Users/.../file.php> on line 30 Warning: stream_socket_client(): Failed to enable crypto in <Users/.../file.php> on line 30 Warning: stream_socket_client(): unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) in <Users/.../file.php> on line 30 Failed to connect: 0 

Todo esto comenzó desde que pasé a GM Seed de macOS Sierra. ¿Qué hay de nuevo en macOS Sierra que afecta las conexiones SSL? ¿Cómo resuelvo esto?

Tengo el mismo error y esto es lo que hice:

1) actualicé mi openssl (creo que no lo necesito) llegué al paso 2, porque esto tomará unos 10 minutos

 brew install openssl 

asegúrate de haberlo actualizado correctamente:

 openssl version 

Si no, testing esto o google:

 brew link --force openssl 

2) revise la ruta php default_cert_file:

 php -r "print_r(openssl_get_cert_locations());" 

esto es lo que obtuve:

 Array ( [default_cert_file] => /usr/local/libressl/etc/ssl/cert.pem [default_cert_file_env] => SSL_CERT_FILE [default_cert_dir] => /usr/local/libressl/etc/ssl/certs [default_cert_dir_env] => SSL_CERT_DIR [default_private_dir] => /usr/local/libressl/etc/ssl/private [default_default_cert_area] => /usr/local/libressl/etc/ssl [ini_cafile] => [ini_capath] => ) 

3) descarga cacert.pem desde aquí:

 wget http://curl.haxx.se/ca/cacert.pem 

4) mueve el file cacert.pem a tu ruta pnetworkingeterminada_cert_file (como root):

 sudo mv cacert.pem /usr/local/libressl/etc/ssl/cert.pem 

Probablemente necesite crear este directory primero.

Después de esto, mi script php funcionó.

Recibí el mismo error después de actualizar a macOS Sierra mientras usaba script php para enviar notifications push .

Solución con la installation del certificate para

[default_cert_file] => /usr/local/libressl/etc/ssl/cert.pem no ayudó también.


Actualizado a PHP v. 5.6.27, macOS Sierra 10.12.4


Y, después de todo, encontré mi problema. Fue en el hecho, que macOS Sierra actualizó la versión de PHP a 5.6.27

Para comprobarlo, escriba Terminal

php -v

 PHP 5.6.27 (cli) (built: Oct 23 2016 11:47:58) Copyright (c) 1997-2016 The PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies 

Y aquí están los cambios de OpenSSL en PHP 5.6.x

Como solución temporal, alguien sugirió inhabilitar nuevas características de security en el script php (en el enlace de arriba, parte muy inferior).

Más seguro (y lo recomiendo) sería una manera de configurar la ruta a entrust_2048_ca.cer explícitamente como

  $streamContext = stream_context_create([ 'ssl' => [ 'verify_peer' => true, 'verify_peer_name' => true, 'cafile' => '/path/to/bundle/entrust_2048_ca.cer', ] ]); 

Funciona también

Puede get un certificate de Entrust. Descargue el certificate entrust_2048_ca.cer desde: https://www.entrust.com/get-support/ssl-certificate-support/root-certificate-downloads/ . Después de download entrust_2048_ca.cer , lo copié en el mismo directory donde estaba mi script php y todo funcionó.

Más detalles aquí: https://stackoverflow.com/a/28222783/4253579

agregando a la respuesta dada por @Sandar también puedes configurar el café como este

 stream_context_set_option($streamContext, 'ssl', 'cafile', '/path/to/entrust_2048_ca.cer');