将公钥导出到Ruby中的base64



我有一个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...

顺便说一句,我必须为WebPush协议做这件事,该协议规定:

您必须将您的VAPID公钥添加到Crypto-key头中,作为一个base64 url编码的字符串,并在其前面加上p256ecdsa=。

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编码的。

很抱歉有点晚了。

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

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

例如

openssl ecparam -name prime256v1 -genkey -noout -out vapid_private.pem
openssl ec -in vapid_private.pem -pubout -out vapid_public.pem

A";PEM";是一个格式化的文件,包括一个标准的标题行、一个页脚行和一组长字符串。(不确定这是否是他们的技术术语,但是的,我会同意的。)那些长串垃圾是以特定格式保存的关键数据的Base64表示。

老实说,我强烈鼓励在可能的情况下使用图书馆。jwt.io有许多可以使用的Ruby库,以及其他语言的库。至于";加密密钥:";头,有一些好消息/其他消息。

  1. 您可以从您的vapid-public.pem文件中获取Crap的长字符串,将它们附加在一起,并将它们指定为'p256ecdsa='键
  2. VAPID协议即将更改https://datatracker.ietf.org/doc/html/draft-ietf-webpush-vapid-02

该更改有效地消除了加密密钥p256ecdsa组件。相反,授权密钥变为:

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

例如

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

我对此意见不一。它确实减少了对单独表头的需求,但也缩短了在您用完表头空间之前可以塞进索赔中的信息量。

您可以尝试

require 'base64'
Base64.encode64(ecdsa_public_key)

转换为base64

最新更新