在Ruby

时间:2017-02-06 14:29:44

标签: ruby pem web-push push-api vapid

我有一个用PEM格式生成的公钥:

ecdsa_public_key = OpenSSL::PKey::EC.new ecdsa_private_key
ecdsa_public_key.private_key = nil
ecdsa_public_key.to_pem

我必须阅读PEM字符串并获取 base64 url​​编码字符串。 我怎么能在Ruby中做到这一点?

ecdsa_public_key = OpenSSL::PKey.read pem_string
ecdsa_public_key.to_base64 # pseudo code...

BTW我必须为WebPush协议执行此操作,该协议声明:

  

您必须将您的VAPID公钥添加到Crypto-Key标头,作为base64 url​​编码的字符串,其前面加上p256ecdsa =。

3 个答案:

答案 0 :(得分:3)

PEM字符串实际上是64位编码(至少部分),但我认为这不是你想要的,它包含其他细节,我认为你想要“原始”公钥数据。

这是您可以将密钥转换为我认为您想要的格式的一种方法。这有点长,但我不认为Ruby的OpenSSL绑定提供了更直接的方法(首先需要require "base64"):

# Assuming the key is in ecdsa_public_key
Base64.urlsafe_encode64(ecdsa_public_key.public_key.to_bn.to_s(2), padding: false)

这会调用public_key来获取基础OpenSSL::PKey::EC::Point,然后以正确的格式将其转换为OpenSSL::BN,并将其转换为二进制字符串。最后这个字符串是base64编码的。

答案 1 :(得分:0)

很抱歉这有点晚了。

我对Ruby并不十分熟悉,所以我不能提供代码示例来做什么,但我可以尝试描述VAPID的过程。 (另外,如果我进入不必要的细节,我很抱歉,因为我认为其他人可能偶然发现了这一点。)

简而言之,VAPID是一个Javascript Web令牌(JWT)。您可以使用您最喜欢的ECDSA生成方法专门为VAPID创建一个ECDSA密钥对。

e.g。

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:”标题,还有一些好消息/其他新闻。

  1. 您可以从vapid-public.pem文件中获取长字符串Crap,将它们附加在一起并将它们指定为“p256ecdsa =”键。
  2. VAPID协议即将更改https://tools.ietf.org/html/draft-ietf-webpush-vapid-02
  3. 这一变化有效地消除了Crypto-Key p256ecdsa组件。相反,授权密钥变为:

    授权:vapid t = 包含VAPID信息的JWT ,k = VAPID公钥

    e.g。

    vapid t=eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtYWlsdG86d2VicHVzaF9vcHNAY2F0ZmFjdHMuZXhhbXBsZS5jb20iLCJleHAiOjE0ODc0NDM3MTR9.mlLOWYMt-6aM3NB6b6_Msf8LqRKCuHd1Vfdp_fuJ3eqsQoID8lit305hIfNubTbvfACucuCygF3qB4scDbuHvg,k=EJwJZq_GN8jJbo1GGpyU70hmP2hbWAUpQFKDByKB81yldJ9GTklBM5xqEwuPM7VuQcyiLDhvovthPIXx-gsQRQ
    

    我对此持不同意见。它确实减少了对单独标题的需求,但也缩短了在用完标题空间之前可以推送到索赔中的信息量。

答案 2 :(得分:-1)

你可以尝试

  require 'base64'
  Base64.encode64(ecdsa_public_key)

转换为base64