VAPID公钥是否与applicationServerKey客户端相同?

Fli*_*imm 3 service-worker web-push vapid

在客户端,订阅网页推送通知,您需要致电subscribeapplicationServerKey选项,如下所示:

var serviceWorkerRegistration = ...
serviceWorkerRegistration.pushManager.subscribe({
  userVisibleOnly: true,
  applicationServerKey: urlB64ToUint8Array("......")
}).then(function(subscription) {
   ...
})
Run Code Online (Sandbox Code Playgroud)

您可以将subscription对象发送到可以保存对象的服务器。

要向订阅者发送推送消息,服务器需要发布到endpoint对象中的键所指示的URL subscription。服务器需要使用VAPID向提供商(Mozilla或Google或任何人)标识自己。例如,使用Python库pywebpush,将进行以下调用:

import pywebpush
pywebpush.webpush(
    subscription,
    data,
    vapid_private_key="path_to_private_key.pem",
    vapid_claims={"sub": "mailto:example@example.com"},
)
Run Code Online (Sandbox Code Playgroud)

这是我的问题:

用于发送推送消息的私有VAPID密钥是否与serviceWorkerRegistration.pushManager.subscribe在客户端传递的公共密钥相对应?还是它属于单独的密钥对?我的直觉告诉我它应该属于同一个密钥对,但是术语VAPID仅在谈论发送推送消息时才提到,而在订阅时却没有提到,因此我不确定该假设是正确的。

Fli*_*imm 5

是的,它属于同一密钥对。此博客文章Web Push Interoperability Wins使其更加清晰:

这个过程非常简单:

  1. 您的应用程序服务器将创建一个公用/专用密钥对。公钥已提供给您的Web应用程序。
  2. 当用户选择接收推送时,将公钥添加到subscribe()调用的options对象。
  3. 当您的应用服务器发送推送消息时,请包括签名的JSON Web令牌以及公共密钥。

根据服务器上使用的库,可能需要使用其他格式的私钥。例如,pywebpush对于Python,期望VAPID EC2私钥PEM文件或DER格式和base64的字符串。