2016-08-06 5 views
2

Wie erstelle ich ein OpenSSL::PKey Objekt, das mit der folgenden öffentlichen Schlüsselzeichenfolge initialisiert wird? Endziel ist die Verwendung des Objekts zum Dekodieren eines JWT-Tokens unter Verwendung von ruby-jwt.Wie erstellt man OpenSSL :: PKey mit einer öffentlichen Schlüsselzeichenfolge?

Ich habe folgendes versucht:

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 

ultimative Ziel ist es, Decodierung JWT zu verwenden:

# 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 }) 

Irgendwelche Ideen für OpenSSL::PKey mit Public-Key-String initialisiert?

+0

Gibt es ein zusätzliches Anführungszeichen am Anfang Ihres 'public_key'? – Aetherus

+0

Es ist kein öffentlicher Schlüssel; Es ist ein X.509-Zertifikat: *** "BEGIN CERTIFICATE" ***. Extrahieren Sie den öffentlichen Schlüssel aus dem Zertifikat und verwenden Sie ihn stattdessen. – jww

Antwort

7

Wie in den Kommentaren erwähnt, Sie haben keine öffentlichen RSA-Schlüssel direkt, sondern ein RSA-Zertifikat statt, die einen öffentlichen Schlüssel enthält, und es ist ziemlich einfach zu extrahieren:

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 }) 

Natürlich Dies funktioniert nur, wenn das Token mit dem entsprechenden privaten Schlüssel des Zertifikats signiert wurde. I.e. für ein Token, das wie folgt erstellt wurde:

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' 
+0

Danke Seba, es funktioniert. Ich habe mich gefragt, ob ich ein Zertifikat anstelle eines öffentlichen RSA-Schlüssels hatte und habe es versucht, aber ich wusste nicht, dass ich den Schlüssel daraus extrahieren musste. Neu zu diesem Zeug und keiner der Richtlinien, die ich durchschaute, erwähnt, wie diese Sache zusammenarbeitet. – HM1

Verwandte Themen