如何创建使用以下公钥字符串初始化的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的任何想法吗?
解决方法
如评论中所述,您没有直接使用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,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'