5

Ich bekomme manchmal - aber nicht immer - einen Fehler von Google Identity Toolkit, der "Klartext zu groß" sagt. Es scheint in einem Abschnitt zu sein, wenn es versuchen sollte, die Signatur zu überprüfen (mit RSA). Da der SHA256-Hash der Nutzdaten verifiziert wird, sollte die Klartextgröße nicht geändert werden.Unterbrochener (aber häufiger) Google Identity Toolkit-Überprüfungsfehler: "Klartext zu groß"

Wenn ich lüge das Token, es zu benutzen versucht, und gibt, dass an den Debugger an https://jwt.io/, zusammen mit dem Google RSA-Zertifikat (von https://www.googleapis.com/identitytoolkit/v3/relyingparty/publicKeys, den Schlüssel-ID verwenden, die Puts im roten Feld oben jwt.io unter "Kind"), es sagt, dass die Unterschrift gültig ist.

Dies passiert nur ein Teil der Zeit, vielleicht etwas mehr als die Hälfte. Wenn ich die Authentifizierung wiederhole, scheint es in Ordnung zu sein.

Dies scheint nur bei neuen Authentifizierungen zu passieren; Wenn es bereits authentifiziert ist, funktioniert alles gut, obwohl ich momentan kein Session-Cookie verwende: Mein Code überprüft die gtoken-Authentifizierung bei jeder Anfrage. Sobald ich mich angemeldet habe, ist alles in Ordnung, bis ich mich abmelde (wieder über Gitkit). Aber wenn ich mich später erneut anmelde, werde ich wahrscheinlich diesen Fehler treffen.

Ich verwende App Engine für meine Infrastruktur. Dies geschieht sowohl mit dev_appserver als auch mit der bereitgestellten App Engine und mit beiden Desktop-Browsern, die die JavaScript Gitkit-Bibliothek und eine iOS-App mit der Objective C gitkit-Bibliothek verwenden. (. Ich habe nicht mit iOS gegen dev_appserver, nur in Einsatz getestet)

Der Code Ich verwende sieht wie folgt aus:

gtoken = cookie["gtoken"].value 
    logging.debug("Verifying Google Identity Toolkit token: %s", 
        gtoken) 
    gitkit_user = gitkit_instance.VerifyGitkitToken(gtoken) 

Der Stack-Trace folgt (beginnend mit der Zeile oben zitierten):

File "/base/data/home/apps/redacted/redacted.py", line 218, in redacted: 
    gitkit_user = gitkit_instance.VerifyGitkitToken(gtoken) 
    File "/base/data/home/apps/redacted/lib/identitytoolkit/gitkitclient.py", line 266, in VerifyGitkitToken 
    parsed = crypt.verify_signed_jwt_with_certs(jwt, certs, aud) 
    File "/base/data/home/apps/redacted/lib/oauth2client/crypt.py", line 240, in verify_signed_jwt_with_certs 
    _verify_signature(message_to_sign, signature, certs.values()) 
    File "/base/data/home/apps/redacted/lib/oauth2client/crypt.py", line 119, in _verify_signature 
    if verifier.verify(message, signature): 
    File "/base/data/home/apps/redacted/lib/oauth2client/_pycrypto_crypt.py", line 52, in verify 
    SHA256.new(message), signature) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/pycrypto-2.6/Crypto/Signature/PKCS1_v1_5.py", line 148, in verify 
    m = self._key.encrypt(S, 0)[0] 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/pycrypto-2.6/Crypto/PublicKey/RSA.py", line 150, in encrypt 
    return pubkey.pubkey.encrypt(self, plaintext, K) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/pycrypto-2.6/Crypto/PublicKey/pubkey.py", line 75, in encrypt 
    ciphertext=self._encrypt(plaintext, K) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/pycrypto-2.6/Crypto/PublicKey/RSA.py", line 224, in _encrypt 
    return (self.key._encrypt(c),) 
ValueError: Plaintext too large 

der Fehler „Klartext zu groß“ sollte nur dann geschehen, wenn die Größe der Nutzlast, die Größe des Schlüssels RSA überschreitet. Da es einen SHA256-Hash gegen einen 2048-Bit-RSA-Schlüssel verifiziert, sollte es in Ordnung sein, also frage ich mich, ob es manchmal ein Problem mit dem Laden des Schlüssels von googleapis.com gibt. Mein nächster Schritt besteht darin, das API-Statistikmodul zu verwenden, um in den Anforderungen, in denen dies geschieht, nach urlfetch-Aufrufen zu suchen und _pycrypto_crypt.py zu erweitern, um zu protokollieren, gegen welchen RSA-Schlüssel es verifiziert werden soll. Aber ich dachte, ich würde hier bei Stack Overflow nachsehen und sehen, ob jemand diesen Weg schon gegangen ist.

Update: Mit einigen zusätzlichen Protokollierung, lernte ich ein paar Dinge. Anstatt die in den JWT-Headern angegebene Schlüssel-ID zu verwenden, iteriert die gitkit-API (oder eine der verwendeten Bibliotheken) zunächst jeden Schlüssel im Google Identity Toolkit-Keyset. Zweitens, wenn ich den Fehler in den Zeiten bekommen habe, in denen ich genug Logging hatte, hat es einen der Schlüssel getestet, der wirklich im Keyset ist, so dass meine Theorie über Probleme beim Laden der Schlüssel ungültig wird. Aber es versucht wirklich, eine 256-Byte-Zeichenfolge gegen einen 2048-Bit-Schlüssel zu überprüfen, also sollte es vollkommen in Ordnung sein.

Schließlich, obwohl es normalerweise über alle Schlüssel iteriert, in den Zeiten bekomme ich diesen Fehler, es trifft den Fehler auf den ersten Schlüssel, den es versucht. Das lässt mich fragen, ob ich in einigen Fällen schon früh einen kaputten Pycrypto importiere.

Wie Sie aus dem Backtrace sehen, verwende ich die von Google bereitgestellte pycrypto, obwohl es eine lokal kompilierte im "lib" -Verzeichnis meiner App (die in sys.path ist), die dort gespeichert wurde, wenn ich im Google Identity Toolkit bereitgestellt.

+1

Ich habe genau das gleiche Problem auch (mit identischen Fehlermeldungen) .. alle Aktualisierungen auf, wo Sie sind in ? – Dennis

+0

Das gleiche Problem auftritt. Hast du irgendeine Lösung gefunden? –

+1

@SonyKadavan Ich fürchte nicht. Ich habe PyCryptoVerifier.verify Code hinzugefügt und versuche es: catch block da drin. Es wird jetzt False für einen ValueError zurückgeben, anstatt den Fehler zu verbreiten. Es scheint eine Workaround zu sein, aber ich bin nicht glücklich damit. – Piquan

Antwort

0

PyCrypto ist deprecated and discouraged to be used by the maintainer.
Wenn Sie den GAE-Standard verwenden, können Sie sich immer noch auf das systemeigene Python-SSL verlassen.

Ich habe diesen Fehler gelegentlich erlebt. Wie Sie sehr gut gesagt haben, hängt das mit der Tatsache zusammen, dass PyCrypto über alle möglichen Schlüssel im Schlüsselsatz iteriert, also können Sie abhängig von der Reihenfolge einen Schlüssel groß genug treffen, um die erwarteten Ressourcen dafür auszuschöpfen, wie in one of the issues referring to it angegeben.

Ich habe mit ssl: 2.7.11 für eine Weile ohne Probleme gearbeitet. Wenn Sie möchten, um es auszuprobieren und haben keine intrinsische Abhängigkeit PyCrypto, aktualisiert Ihr app.yaml zu:

- name: ssl 
    version: "2.7.11"