2015-08-24 9 views
5

Neue Frage, um diese Frage spezifisch und auf den Punkt zu bringen.Wie verifiziere ich ein JSON-Web-Token mithilfe eines öffentlichen RSA-Schlüssels?

Ich habe eine JWT von Azure und jetzt muss ich die Signatur in meiner Anwendung überprüfen.

https://login.windows.net/common/discovery/keys

Wie verwende ich diese Schlüssel eine Signatur zu überprüfen:

die öffentlichen Schlüssel von Microsoft finden Sie hier? Ich kann sagen, dass dies die öffentlichen Schlüssel sind, die ich brauche, da der X5T-Header in dem JWT mit denen auf dieser öffentlichen Schlüsselliste übereinstimmt.

Ich benutze die JWT PHP-Bibliothek, aber alles, was ich als öffentlicher Schlüssel eingeben scheint zu scheitern.

supplied key param cannot be coerced into a public key 

Also mit dem obigen Link, das geht von dort in die PHP openssl_verify Funktion als Parameter drei ($ key im Beispiel unten)?

$success = openssl_verify($msg, $signature, $key, 'SHA256') 

Alles, was ich eingib, verursacht auf die eine oder andere Weise einen Fehler.

Danke,

+0

Ganz unten auf der Seite dieses Links http://bshaffer.github.io/oauth2-server-php-docs/overview/jwt-access-tokens/ wird beschrieben, wie man eine JWT mit PHP verifiziert. – honerlawd

Antwort

8

Problem gelöst.

Es stellte sich heraus, dass der X5C Teil des JSON Array ist das Zertifikat nicht öffentlichen Schlüssel so JSON Dekodierungs https://login.windows.net/common/discovery/keys und greifen die X5C Element und mit OpenSSL den öffentlichen Schlüssel Werke abzuleiten:

$cert_object = openssl_x509_read($cert); 

$pkey_object = openssl_pkey_get_public(cert_object); 

$pkey_array = openssl_pkey_get_details($pkey_object); 

$publicKey = $pkey_array ['key']; 

In diesem Beispiel $ cert ist der X5C-Wert. Dies allein reicht jedoch nicht aus, da es nicht nach X509 codiert ist. Also, was ich getan habe, ist eine neue Datei in Windows mit dem Namen certificate.cer erstellen, im Editor öffnen und den X5C-Wert dort eingeben. Durch Doppelklick auf ther .cer in Windows, Navigieren zur Registerkarte Details und Klick auf "In Datei kopieren" öffnet sich der Zertifikatexportassistent.

Exportieren als X509 und auf den Server hochladen.

$cert = file_get_contents('Certificates/Public/public.cer'); 

Funktioniert! Es gibt wahrscheinlich einen einfacheren Weg, aber das funktioniert.

Verwandte Themen