Какие параметры x, y и кривой ключа подписи Apple используются для подписи маркеров push-уведомлений? - PullRequest
1 голос
/ 20 мая 2019

Как я понял, у меня есть 2 способа отправки push-уведомлений в Apple APN: на основе сертификатов и на основе токенов.Я выбрал руководство по токенам

. В Apple говорится, что нам нужно создавать токен и обновлять его как минимум каждый час.Итак, я создал задание cron, которое обновляет этот токен каждый час и помещает его в файл на моем сервере.Другое задание cron читает этот токен для отправки новых ожидающих push-уведомлений каждую секунду.

Проблема возникает в задании refresh_token, которое я запускаю каждый час.Я использую это библиотека для создания JWT: https://web -token.spomky-labs.com / v / v2.x / components / signature-tokens-jws / jws-creation

Вот мой код (я только что следовал руководству, которое я только что дал как ссылку):

$algorithmManager = AlgorithmManager::create([
    new ES256()
]);


// Our key.
$jwk = new JWK([
    'kty' => 'EC', // *** PROBLEM HERE ***
    'k' => $keyFile
]);

// The JSON Converter.
$jsonConverter = new StandardConverter();

// We instantiate our JWS Builder.
$jwsBuilder = new JWSBuilder(
    $jsonConverter,
    $algorithmManager
);

// The payload we want to sign. The payload MUST be a string hence we use our JSON Converter.
$payload = $jsonConverter->encode([
    'iat' => time(),
    'nbf' => time(),
    'exp' => time() + 3600,

    'iss' => APPLE_TEAM_ID
]);

$jws = $jwsBuilder
    ->create()                                
    ->withPayload($payload)                 
    ->addSignature($jwk, /* with header: */['kid' => APPLE_KEY_NAME, 'alg' => 'ES256']) 
    ->build();                             

Этот код вызывает исключение при -> build ();функция, в конце.Это говорит о том, что параметры x, y и crv не указаны в ключе.Эти параметры, кажется, связаны с алгоритмом (ES256), потому что, когда я выбираю alg, предоставленный в руководстве JWT, они не спрашивают меня об этих параметрах.

Хотя Apple не предоставила никакой информации о ключе, который они дали мне на своем веб-сайте.Вот их руководство: https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/establishing_a_token-based_connection_to_apns

1 Ответ

1 голос
/ 21 мая 2019

Неправильный способ загрузки ключа.Ключ в руководстве соответствует ключу октета, а не ключу EC.Ключ JWK EC должен выглядеть следующим образом: , как показано в разделе 3 в разделе RFC7517 (с параметрами crv, x и y).

Необходимо преобразовать файл ключавы получили от сервисов Apple ключ JWK EC.Поскольку у вас уже есть PHP на вашей платформе, я рекомендую использовать CLI tool :

curl -OL https://github.com/web-token/jwt-app/raw/gh-pages/jose.phar
curl -OL https://github.com/web-token/jwt-app/raw/gh-pages/jose.phar.pubkey
chmod +x jose.phar

# Replace `/path/to/you/private/key/file.p8` with the actual path to your private key
./jose.phar key:load:key /path/to/you/private/key/file.p8

rm ./jose.phar
rm ./jose.phar.pubkey

Вы должны получить что-то вроде {"kty":"EC","crv":"P-256","d":"…","x":"…","y":"…"}.

JWKможет быть загружен с использованием следующей строки кода:

$jwk = JWK::createFromJson('{"kty":"EC","crv":"P-256","d":"…","x":"…","y":"…"}');
...