抱歉,这有点晚了。
我对 Ruby 不是很熟悉,所以我无法提供代码示例来说明要做什么,但我可以尝试描述一下 VAPID 的过程。(另外,如果我进入不必要的细节,我深表歉意,因为我认为其他人可能会偶然发现这一点。)
简而言之,VAPID 是一种 Javascript Web 令牌 ( JWT )。您可以使用您最喜欢的专门针对 VAPID 的 ECDSA 生成方法创建一个 ECDSA 密钥对。
例如
openssl ecparam -name prime256v1 -genkey -noout -out vapid_private.pem
openssl ec -in vapid_private.pem -pubout -out vapid_public.pem
“PEM”是一个格式化文件,包括一个标准的标题行、一个页脚行和一组长长的废话字符串。(不确定这是否是他们的技术术语,但是是的,我将继续使用。)那些长长的废话字符串是以特定格式保存的关键数据的 Base64 表示。
老实说,我强烈鼓励在可能的情况下使用图书馆。jwt.io 有许多您可以使用的 Ruby 库,以及其他语言的库。至于“Crypto-Key:”标题,有一些好消息/其他消息。
- 您可以从您的 vapid-public.pem 文件中获取长长的废话字符串,将它们附加在一起并将它们指定为 'p256ecdsa=' 键。
- VAPID 协议即将更改https://datatracker.ietf.org/doc/html/draft-ietf-webpush-vapid-02
该更改有效地摆脱了 Crypto-Key p256ecdsa 组件。相反,授权密钥变为:
授权: vapid t= JWT 包含 VAPID 信息,k= VAPID 公钥
例如
vapid t=eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYWlsdG86d2VicHVzaF9vcHNAY2F0ZmFjdHMuZXhhbXBsZS5jb20iLCJleHAiOjE0ODc0NDM3MTR9.mlLOWYMt-6aM3NB6b6_Msf8LqRKCuHd1Vfdp_fuJ3eqsQoID8lit305hIfNubTbvfACucuCygF3qB4scDbuHvg,k=EJwJZq_GN8jJbo1GGpyU70hmP2hbWAUpQFKDByKB81yldJ9GTklBM5xqEwuPM7VuQcyiLDhvovthPIXx-gsQRQ
我对此持不同意见。它确实减少了对单独标题的需求,但也缩短了您在标题空间用完之前可以塞入索赔中的信息量。