Ruby 如何使用公钥字符串创建OpenSSL::PKey?

Ruby 如何使用公钥字符串创建OpenSSL::PKey?,ruby,openssl,jwt,Ruby,Openssl,Jwt,如何创建使用以下公钥字符串初始化的OpenSSL::PKey对象?最终目标是使用对象使用rubyjwt解码JWT令牌 我尝试了以下方法: public_key = ""-----BEGIN CERTIFICATE-----\n ...many characters... \n-----END CERTIFICATE-----\n" # I only have the public key OpenSSL::PKey.read(key) # Gives ArgumentError: Could

如何创建使用以下公钥字符串初始化的
OpenSSL::PKey
对象?最终目标是使用对象使用
rubyjwt
解码JWT令牌

我尝试了以下方法:

public_key = ""-----BEGIN CERTIFICATE-----\n ...many characters... \n-----END CERTIFICATE-----\n" # I only have the public key

OpenSSL::PKey.read(key) # Gives ArgumentError: Could not parse PKey: no start line
OpenSSL::PKey.read(key.gsub("CERTIFICATE", "PUBLIC KEY")) # Gives ArgumentError: Could not parse PKey: ASN1 lib
最终目标是使用它来解码JWT:

# example from docs
require 'jwt'

rsa_public => OpenSSL::PKey.read(File.read(File.join(CERT_PATH, 'rsa-2048-public.pem')))
JWT.decode(token, rsa_public, true, { algorithm: "RS256", verify_iat: true })

使用公钥字符串初始化
OpenSSL::PKey
有什么想法吗?

如评论中所述,您没有直接的RSA公钥,而是一个RSA证书,它包含一个公钥,并且很容易提取:

require 'openssl'
require 'jwt'

cert = "-----BEGIN CERTIFICATE-----\n .... \n-----END CERTIFICATE-----"
x509 = OpenSSL::X509::Certificate.new(cert)

payload = JWT.decode(token, x509.public_key, true, { algorithm: "RS256", verify_iat: true })
当然,这仅在令牌使用该证书对应的私钥签名时有效。即,对于这样创建的令牌:

payload = { data: 'test' }

priv = "-----BEGIN RSA PRIVATE KEY----- .....-----END RSA PRIVATE KEY-----"
rsa_private = OpenSSL::PKey::RSA.new(priv)
token = JWT.encode payload, rsa_private, 'RS256'

您的
公钥
开头是否有额外的引号?它不是公钥;它是一个X.509证书:
开始证书
。从证书中提取公钥并使用它。谢谢Seba,它可以工作。我确实想知道我是否有一个证书而不是RSA公钥,并尝试了它,但我不知道我需要从中提取密钥。我对这些东西还不熟悉,我看过的指南中没有一条提到这些东西是如何工作的/相互关联的。