Getting errors using APNS PHP

22,856
  1. Use the absolute path for the private key instead of relative path.

  2. Make sure the php user (or webserver user, depending.. www-data, apache, nginx, www...) is allowed to read it (chown, chmod).

Share:
22,856
Admin
Author by

Admin

Updated on February 17, 2020

Comments

  • Admin
    Admin over 4 years

    Here's the code I'm using

    <?php
    $deviceToken = 'my device key';  // not putting in for security
    
    $payload['aps'] = array('alert' => 'This is the alert text', 'badge' => 1, 'sound' => 'default');
    $payload = json_encode($payload);
    
    $apnsHost = 'gateway.sandbox.push.apple.com';
    $apnsPort = 2195;
    $apnsCert = 'apns-dev.pem';
    
    $streamContext = stream_context_create();
    stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
    
    $apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);
    
    $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload;
    fwrite($apns, $apnsMessage);
    
    socket_close($apns);
    fclose($apns);
    ?>
    

    and I get these errors

    Warning: stream_socket_client() [function.stream-socket-client]: Unable to set private key file `apns-dev.pem' in /home/bryan/sendpush.php on line 14

    Warning: stream_socket_client() [function.stream-socket-client]: failed to create an SSL handle in /home/bryan/sendpush.php on line 14

    Warning: stream_socket_client() [function.stream-socket-client]: Failed to enable crypto in /home/bryan/sendpush.php on line 14

    Warning: stream_socket_client() [function.stream-socket-client]: unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) in /home/bryan/sendpush.php on line 14

    Warning: fwrite(): supplied argument is not a valid stream resource in /home/bryan/sendpush.php on line 17

    Warning: socket_close() expects parameter 1 to be resource, boolean given in /home/bryan/sendpush.php on line 19

    Warning: fclose(): supplied argument is not a valid stream resource in /home/bryan/sendpush.php on line 20

    I actually now got it down to these errors

    Warning: stream_socket_client() [function.stream-socket-client]: SSL operation failed with code 1. OpenSSL Error messages: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure in /home/bryan/PushService.php on line 27

    Warning: stream_socket_client() [function.stream-socket-client]: Failed to enable crypto in /home/bryan/PushService.php on line 27

    Warning: stream_socket_client() [function.stream-socket-client]: unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) in /home/bryan/PushService.php on line

  • Matt
    Matt over 11 years
    I don't see how the certificate directory would benefit from having any write or execute certificates. Surely 444 (global read) would be enough?
  • Daniel W.
    Daniel W. about 9 years
    Someone does not simply chmod 777/755 the whole server. It's a PRIVATE key for a reason.