$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', $certDir);
Для установления соединения необходим pem сертификат, но из чего конкретно его сделать? Для подписок у меня есть cer и сделанный из него p12 WebPush сертификат, который эпл называет website aps production. Я подумал, что один из этих сертифкатов необходимо переделать в pem. Пробовал .p12 в pem, также пробовал cer подписать приватным ключом от .p12, оба таких сертификата проходят верификацию
openssl s_client -connect gateway.push.apple.com:2195 -cert cert.pem
но пуши так и не приходят. Думаю, что проблема именно в сертификате, ниже прилагаю код
$certDir = 'cert.pem';
$address = 'gateway.push.apple.com:2195';
$deviceToken = 'D1BF307920AEA35AA1E2C3F4B38863FC801F08EEC9BA00FABDDBCFF3C517DAB6';
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', $certDir);
stream_context_set_option($ctx, 'ssl', 'passphrase', '***');
$socketClient = stream_socket_client(
$address,
$errno,
$errstr,
60,
STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT,
$ctx
);
var_dump($errstr);
$payload = array(
'aps' => array(
'alert' => array(
'title' => 'Foo',
'body' => 'bar',
'action' => 'view',
),
)
);
$encodedPayload = json_encode($payload);
// $binaryMessage = chr(0).
// chr(0).
// chr(32).
// pack('H*', $deviceToken).
// chr(0).chr(strlen($encodedPayload)).
// $encodedPayload;
$binaryMessage = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($encodedPayload)) .$encodedPayload;
$result = fwrite($socketClient, $binaryMessage, strlen($binaryMessage));
var_dump($result);
while(!feof($socketClient)) {
var_dump(fgets($socketClient,64));
}
fclose($socketClient);
$errstr = string(0) ""
$result = int(119)
var_dump(fgets($socketClient,64)) = bool(false)