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

HM1*_*HM1 8 ruby openssl jwt

如何创建OpenSSL::PKey使用以下公钥字符串初始化的对象?最终目标是使用该对象来解码JWT令牌ruby-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
Run Code Online (Sandbox Code Playgroud)

最终目标是使用它解码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 })
Run Code Online (Sandbox Code Playgroud)

有关OpenSSL::PKey使用公钥字符串初始化的任何想法吗?

Seb*_*eba 12

如评论中所述,您没有直接使用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 })
Run Code Online (Sandbox Code Playgroud)

当然,这仅在令牌使用该证书的相应私钥签名时才有效.即对于像这样创建的令牌:

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'
Run Code Online (Sandbox Code Playgroud)