Reputation: 3146
I've been working through Ray Wenderlich's tutorials on push notifications using a PHP Script.
Reference: http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1
http://www.raywenderlich.com/32963/apple-push-notification-services-in-ios-6-tutorial-part-2
I have done a ton of research but I have ran into an issue on part 2 where you run the push.php file using the ck.pem file.
/Applications/XAMPP/bin/php push.php development
My only difference is that I'm using XAMPP and not MAMP.
I have confirmed that all the extensions are installed.
I am able to test out my certificate in the terminal by doing this:
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem
It asks me to enter my passphrase and I do. Everything works successfully in the terminal.
However, when I run the push.php file, I get these errors:
PHP Warning: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed PHP Warning: stream_socket_client(): Failed to enable crypto in
PHP Warning: stream_socket_client(): unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) in on line 140
Line 140 in the php file is:
$this->fp = stream_socket_client('ssl://' . $this->server, $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
I found these:
iOS push notification does not work when using crontab scheduler
https://devforums.apple.com/message/1054840#1054840
I have literally retried everything. I know my passphrase is correct. I've re-created my certificates, pem files, and keys. Nothing works. Same error every time I do this.
I'm beyond confused.
Does anyone have any suggestions or know what's going on?
Thank you!
UPDATE 1:
I have also tried setting the full path to the ck.pem file that does not fix the error either.
Upvotes: 13
Views: 10182
Reputation: 1082
Update to macOS sierra 10.12.5
please add
stream_context_set_option($ctx, 'ssl', 'verify_peer', false);
The problem is in new PHP Version in macOS Sierra
Upvotes: 5
Reputation: 1847
add
stream_context_set_option($ctx, 'ssl', 'verify_peer', false);
which defeats the server validation. Credits @One In a Million Apps in a comment above.
Upvotes: 3
Reputation: 1375
Updated to macOS Sierra 10.12.4
The problem is in new PHP Version in macOS Sierra. They changed the way it works with certificates.
I would suggest a small changes in the accepted answer to make things explicit.
You have to setup path to entrust_2048_ca.cer and other parameters during creation of the stream context like
$streamContext = stream_context_create([
'ssl' => [
'verify_peer' => true,
'verify_peer_name' => true,
'cafile' => '/path/to/bundle/entrust_2048_ca.cer',
]
]);
The full explanation and links are here
Upvotes: 6
Reputation: 3146
Okay, I finally figured this out! After 2 days of working with this.
So, for anyone else who runs into this issue:
Download the entrust_2048_ca.cer certificate from: https://www.entrust.com/get-support/ssl-certificate-support/root-certificate-downloads/
Scroll down and get the Entrust.net Certificate Authority (2048)
Then, in the push.php file, after you set the context for the passphrase, add this line:
stream_context_set_option($ctx, 'ssl', 'cafile', 'entrust_2048_ca.cer');
Upvotes: 57