I checked this url
and followed the steps to generated pem file from p12 file. Below is the code to generate the pem file.
....
if ($this->file->save($uploadDirectory . $filename . '.' . $ext)) {
$filenamewithpath = $uploadDirectory . $filename . '.' . $ext;
$handle = fopen($filenamewithpath, 'r');
$p12buf = fread($handle, filesize($filenamewithpath));
fclose($file);
$password = #$p12pwd;
$results = array();
$worked = openssl_pkcs12_read($p12buf, $results, $password);
//d($results); exit;
if ($worked) {
//echo '<pre>', print_r($results, true), '</pre>';
$new_password = null;
$result = null;
$worked = openssl_pkey_export($results['pkey'], $result, $new_password);
if($worked) {
//echo "<pre>It worked! Your new pkey is:\n", $result, '</pre>';
file_put_contents( $uploadDirectory . $filename . '.pem',$result);
return array(
'success' => true,
'filename'=>$filename . '.pem',
'uploaddir' =>$uploadDirectory,
);
} else {
return array('error' => openssl_error_string());
}
} else {
return array('error' => openssl_error_string());
}
}
....
I got it working fine and generated pem file is stored in given directory. Now i am trying to use this pem file for push notification. Check the below code,
<?php
$apnsHost = 'gateway.sandbox.push.apple.com';
//$apnsHost = 'gateway.push.apple.com';
$apnsCert = 'test.pem';
$apnsPort = 2195;
$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);
$payload['aps'] = array('alert' => 'this is test!', 'badge' => 1, 'sound' => 'default');
$output = json_encode($payload);
$token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$token = pack('H*', str_replace(' ', '', $token));
$apnsMessage = chr(0) . chr(0) . chr(32) . $token . chr(0) . chr(strlen($output)) . $output;
//var_dump($apnsMessage); exit;
fwrite($apns, $apnsMessage);
#socket_close($apns);
fclose($apns);
?>
When i ran this code, i got below error,
Warning: stream_socket_client(): Unable to set local cert chain file `test.pem'; Check that your cafile/capath settings include details of your certificate and its issuer in /var/www/html/myserver/apns/test.php on line 13
Warning: stream_socket_client(): failed to create an SSL handle in /var/www/html/myserver/apns/test.php on line 13
Warning: stream_socket_client(): Failed to enable crypto in /var/www/html/ela/apns/test.php on line 13
Warning: stream_socket_client(): unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) in /var/www/html/myserver/apns/test.php on line 13
Warning: fwrite() expects parameter 1 to be resource, boolean given in /var/www/html/myserver/apns/test.php on line 20
Warning: fclose() expects parameter 1 to be resource, boolean given in /var/www/html/myserver/apns/test.php on line 23
Kindly advice to fix this issue.
I would have called
'openssl pkcs12 -in cert.p12 -inpass pass:password ...something.. ..something...'
on the command line and tried to pick up or pipe its output back. Perhaps there is a wrapper for that in php, otherwise a system command seems the most easy route.
I had the same kind of issue when developing for iOS. We howerve got *.cer certificates and changed them to *.pem using the following command line:
openssl x509 -inform der -in aps_production_identity.cer -out aps_production_identity.pem
If this does not work make sure to include the private key as indicated here:
Apple Push Notification Service
Related
<?php
$message = 'Hello';
$badge = 3;
$sound = 'default';
$development = false;
$payload = array();
$payload['aps'] = array('alert' => $message, 'badge' => intval($badge), 'sound' => $sound);
$payload = json_encode($payload);
$apns_url = NULL;
$apns_cert = NULL;
$apns_port = 2195;
if($development)
{
$apns_url = 'gateway.sandbox.push.apple.com';
$apns_cert = 'pushcert.pem';
}
else
{
$apns_url = 'gateway.push.apple.com';
$apns_cert = 'pushcert.pem';
}
$stream_context = stream_context_create();
stream_context_set_option($stream_context, 'ssl', 'local_cert', $apns_cert);
$apns = stream_socket_client('ssl://' . $apns_url . ':' . $apns_port, $error, $error_string, 2, STREAM_CLIENT_CONNECT, $stream_context);
echo $error;
echo $error_string;
// You will need to put your device tokens into the $device_tokens array yourself
$device_tokens = array();
foreach($device_tokens as $device_token)
{
$apns_message = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $device_token)) . chr(0) . chr(strlen($payload)) . $payload;
fwrite($apns, $apns_message);
}
#socket_close($apns);
#fclose($apns);
?
Errors:
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 /opt/lampp/htdocs/conductexam/admin/includes/PushTest/iospush1.php on line 29
Warning: stream_socket_client(): Failed to enable crypto in /opt/lampp/htdocs/conductexam/admin/includes/PushTest/iospush1.php on line 29
Warning: stream_socket_client(): unable to connect to ssl://gateway.push.apple.com:2195 (Unknown error) in /opt/lampp/htdocs/conductexam/admin/includes/PushTest/iospush1.php on line 29
0
Hello I try to send Push Notifications via PHP over the FTP-Hoster square7.ch, but I always get a few errors. The certificate is on the server.
Can anyone help me?
Here's the PHP code:
<?php
$streamContext= stream_context_create();
stream_context_set_option($streamContext , 'ssl','local_cert' , 'TestPushApp.pem');
//stream_context_set_option($streamContext , 'ssl' , 'passphrase','password');
$socketClient = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195',$error,$errorString,60,STREAM_CLIENT_CONNECT,$streamContext);
$payload['aps']= array('alert' => 'Erste Push Nachricht ueber PHP','sound' => 'default','badge' => '20');
$payload= json_encode($payload);
echo $payload;
$deviceToken = str_replace(' ','','XXXXXXXXXXXXXXXXXX');
$message= pack('CnH*',0,32,$devicetoken);
$message= $message . pack ('n',strlen($payload));
$message= $messgae . $payload;
fwrite($socketClient,$message);
fclose($socketClient);
?>
Here's the error message:
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 /users/michaellll/www/push.php on line 5
Warning: stream_socket_client() [function.stream-socket-client]: Failed to enable crypto in /users/michaellll/www/push.php on line 5
Warning: stream_socket_client() [function.stream-socket-client]: unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) in /users/michaellll/www/push.php on line 5
{"aps":{"alert":"Erste Push Nachricht ueber PHP","sound":"default","badge":"20"}}
Warning: fwrite() expects parameter 1 to be resource, boolean given in /users/michaellll/www/push.php on line 13
Warning: fclose() expects parameter 1 to be resource, boolean given in /users/michaellll/www/push.php on line 14
// Push Notification code for IPHONE in PHP
$deviceToken = $users_rows['gcm_regid'];
$passphrase = 'pass1234';
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'DrinksterDevelopment.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
$fp = stream_socket_client(
'ssl://gateway.sandbox.push.apple.com:2195', $err,
$errstr, 120, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
if (!$fp)
exit("Failed to connect: $err $errstr" . PHP_EOL);
echo 'Connected to APNS' . PHP_EOL;
$body['aps'] = array(
// 'alert' => $_GET["message"].'#'.$_GET["type"].'#'.$_GET["deal_id"],
'alert' => $_GET["message"],
'sound' => 'default'
);
$body['other'] = $_GET["type"].'#'.$_GET["deal_id"];
$payload = json_encode($body);
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
$result_iphone = fwrite($fp, $msg, strlen($msg));
if (!$result_iphone)
$msg_iphone = 'Message not delivered' . PHP_EOL;
else
$msg_iphone = 'Message successfully delivered' . PHP_EOL;
mail('jackbrown00001#gmail.com', 'IOSPushMsgStatus', $msg_iphone);
fclose($fp);
}
I think its SSL issue, enable SSL then it might work. One more thing is there stream_context_set_option($streamContext , 'ssl','local_cert', 'TestPushApp.pem');
it must be like this
$options = array('ssl' => array('local_cert' => 'include/TestPushApp.pem','passphrase' => '//Provided passpharase to you'));
stream_context_set_option($streamContext , $options);
and if you are having production certificate i. e pem file then its good to use ssl://gateway.push.apple.com:2195
Here file writes function will contain two params only fwrite($fp, $msg); not the length of that packaged message.
While i am sending push notifications to multiple iphone devices using php webservices i am getting warning messages like :
Warning: stream_socket_client() [function.stream-socket-client]: SSL: crypto enabling timeout in /home/sample_app/pushnotification.php on line 66
Warning: stream_socket_client() [function.stream-socket-client]: Failed to enable crypto in /home/sample_app/pushnotification.php on line 66
Warning: stream_socket_client() [function.stream-socket-client]: unable to connect to ssl://gateway.push.apple.com:2195 (Unknown error) in /home/sample_app/pushnotification.php on line 66
Warning: fclose() expects parameter 1 to be resource, boolean given in /home/sample_app/pushnotification.php on line 79
This is my code :
$message='testing';
$q1="select devicetoken from tbl_devicetokens";
$re1 = mysql_query($q1);
while($row1=mysql_fetch_row($re1))
{
pushMessage($row1[0],$message,'myapp');
}
function pushMessage($deviceToken,$message,$app) {
echo "Sending iPhone Push Notifications to " . $deviceToken . "<br /><br />";
echo "Your Message: " . $message . "<br /><br />";
$time = time();
$apnsHost = 'gateway.push.apple.com';
$apnsPort = 2195;
$apnsCert = 'apns-myapp.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);
if($apns) {
$payload = array();
$payload['aps'] = array('alert' => $message, 'badge' => 0, 'sound' => 'default');
$payload = json_encode($payload);
$apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload;
fwrite($apns, $apnsMessage);
} else {
echo "Connection Failed - iPhone Push Notifications Server";
echo $errorString."<br />";
echo $error."<br />";
}
//socket_close($apns);
fclose($apns);
}
So, can any one tell me how to solve this problem
might seem like a dumb answer, but have you tried your firewall / iptables? Those errors without further information look like connection issues to me. First thing you need to resolve is the timeout problem.
Does this still happen when you push a single notification to a single device?
If it does:
Are you sure that you have the correct path to the certs?
Make sure that the cert file name does not contain other than alphabetic characters.
If not:
Make sure that you are using the correct cert for the correct device environment (development, production)
If a device is jailbroken it will not receive push notifications.
Disclaimer: on SO I found many similar questions and some answers but none solved my issue.
I have this easy PHP code:
<?php
$deviceToken = "myDeviceToken";
$message = "Hello from server";
$badge = 1;
$sound = "default";
// Construct the notification payload
$body['aps'] = array(
'alert' => $message
);
if ($badge) {
$body['aps']['badge'] = $badge;
}
if ($sound) {
$body['aps']['sound'] = $sound;
}
/* End of Configurable Items */
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'my.pem');
$fp = stream_socket_client("ssl://gateway.sandbox.push.apple.com:2195", $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if (!$fp) {
print "Failed to connect $err $errstrn";
return;
} else {
print "Connection OK\n";
}
$payload = json_encode($body);
$msg = chr(0) . pack("n", 32) . pack("H*", str_replace(" ", "", $deviceToken)) . pack("n", strlen($payload)) . $payload;
print "sending message :" . $payload . "\n";
fwrite($fp, $msg);
fclose($fp);
?>
When called from browser I receive:
[13-Dec-2011 18:52:52] PHP 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/srv/public_html/myTest.php on line 28
[13-Dec-2011 18:52:52] PHP Warning: stream_socket_client() [function.stream-socket-client]: Failed to enable crypto in /home/srv/public_html/myTest.php on line 28
[13-Dec-2011 18:52:52] PHP Warning: stream_socket_client() [function.stream-socket-client]: unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) in /home/srv/public_html/myTest.php on line 28
Any idea of what's going on?
Some random finding from the internet which could help:
It may be a certificate problem. Try the stream options allow_self_signed and verify_peer to check that.
Try to use explicitely sslv2:// or sslv3:// ?
Permission problem on "/dev/urandom"
I am working hard on it and openssl is enabled on my server but issue remains as it. Will it make any difference if run it MAc book. Please response if it is done there.
My Code:
<?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);
?>
Error:
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 F:\xampp\htdocs\apns\apns.php on line 24
Warning: stream_socket_client() [function.stream-socket-client]:
Failed to enable crypto in F:\xampp\htdocs\apns\apns.php on line 24
Warning: stream_socket_client() [function.stream-socket-client]:
unable to connect to ssl://gateway.sandbox.push.apple.com:2195
(Unknown error) in F:\xampp\htdocs\apns\apns.php on line 24
Please post if any have an idea.
Thanks
I had the same problem. The solution for me was generate the certificate again. I did it with these commands:
openssl x509 -in testpush_aps_development.cer -inform der -out TestPushCert.pem
openssl pkcs12 -nocerts -out TestPushKey.pem -in TestPush.p12
After that:
cat TestPushKey.pem TestPushCert.pem > TestPushCK.pem
Remember that testpush_aps_development.cer in this case is the certificate that you have in your apple developer page in the section APNS Certificates.
Hope this help you, anyway I'm sure it's a problem with the certificates.
Check your certificates, they cause errors quite oftenly.