我有一个用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 =。
答案 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:”标题,还有一些好消息/其他新闻。
这一变化有效地消除了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