【问题标题】:How to create OpenSSL::PKey using a public key string?如何使用公钥字符串创建 OpenSSL::PKey?
【发布时间】:2016-08-06 17:31:25
【问题描述】:

如何创建使用以下公钥字符串初始化的OpenSSL::PKey 对象?最终目标是使用该对象使用 ruby-jwt 解码 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 有什么想法吗?

【问题讨论】:

  • 你的public_key开头有多余的引号吗?
  • 它不是公钥;它是一个 X.509 证书:BEGIN CERTIFICATE。从证书中提取公钥并改用它。

标签: ruby openssl jwt


【解决方案1】:

正如 cmets 中提到的,您没有直接的 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 })

当然,这仅适用于使用该证书的相应私钥对令牌进行签名的情况。 IE。对于这样创建的令牌:

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'

【讨论】:

  • 感谢 Seba,它有效。我确实想知道我是否有证书而不是 RSA 公钥并尝试过,但我不知道我需要从中提取密钥。对这些东西很陌生,我看过的所有指南都没有提到这些东西是如何工作/相互关联的。
猜你喜欢
  • 2013-03-21
  • 1970-01-01
  • 2017-11-12
  • 2013-06-09
  • 2022-10-22
  • 1970-01-01
  • 1970-01-01
  • 2019-06-18
  • 1970-01-01
相关资源
最近更新 更多