用于签署推送通知令牌的 Apple 签名密钥的 x、y 和曲线参数是什么?
What are x,y and curve parameters of the Apple signing key used to sign push notification tokens?
据我了解,我有两种方式向 Apple APN 发送推送通知:基于证书和基于令牌。我选择了基于令牌的
Apple 指南说我们需要创建一个令牌并至少每小时刷新一次。所以,我创建了一个 cron 作业,每小时刷新一次这个令牌,并将它放在我服务器上的一个文件中。另一个 cron 作业读取此令牌以每秒发送新的待处理推送通知。
问题出在我每小时启动的 refresh_token 作业中。我使用这个库来创建 JWT:https://web-token.spomky-labs.com/v/v2.x/components/signed-tokens-jws/jws-creation
这是我的代码(我只是按照 link 给出的指南操作):
$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)有关,因为当我选择JWT指南中提供的alg时,他们不会问我这些参数。
不过,Apple 没有在他们的网站上提供有关他们给我的密钥的任何信息。这是他们的指南:https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/establishing_a_token-based_connection_to_apns
您加载密钥的方式不正确。指南中的密钥对应于八位组密钥,而不是 EC 密钥。 JWK EC 密钥应类似于 the example showed in the RFC7517 section 3(具有 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":"…"}');
据我了解,我有两种方式向 Apple APN 发送推送通知:基于证书和基于令牌。我选择了基于令牌的
Apple 指南说我们需要创建一个令牌并至少每小时刷新一次。所以,我创建了一个 cron 作业,每小时刷新一次这个令牌,并将它放在我服务器上的一个文件中。另一个 cron 作业读取此令牌以每秒发送新的待处理推送通知。
问题出在我每小时启动的 refresh_token 作业中。我使用这个库来创建 JWT:https://web-token.spomky-labs.com/v/v2.x/components/signed-tokens-jws/jws-creation
这是我的代码(我只是按照 link 给出的指南操作):
$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)有关,因为当我选择JWT指南中提供的alg时,他们不会问我这些参数。
不过,Apple 没有在他们的网站上提供有关他们给我的密钥的任何信息。这是他们的指南:https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/establishing_a_token-based_connection_to_apns
您加载密钥的方式不正确。指南中的密钥对应于八位组密钥,而不是 EC 密钥。 JWK EC 密钥应类似于 the example showed in the RFC7517 section 3(具有 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":"…"}');