5

常にではありませんが、Google Identity Toolkit から「プレーンテキストが大きすぎます」というエラーが表示されることがあります。(RSA を使用して) 署名を検証しようとしているセクションにあるようです。ペイロードの SHA256 ハッシュを検証しているため、平文のサイズにばらつきはありません。

使用しようとしているトークンをログに記録し、それをhttps://jwt.io/のデバッガーに渡し、Google RSA 証明書 ( https://www.googleapis.com/identitytoolkit/v3/relyingparty/から) を渡します。 publicKeys ; jwt.io が上部の「kid」の下の赤いボックスに入れるキー識別子を使用すると、署名が有効であることが示されます。

これはごく一部の時間、おそらく半分強でしか発生しません。認証を繰り返すと、問題ないようです。

これは、新しい認証でのみ発生するようです。すでに認証されている場合、現在セッション Cookie を使用していなくても、すべて正常に動作します。私のコードは、すべてのリクエストで gtoken 認証を検証します。サインインしたら、(再び gitkit を使用して) サインアウトするまでは問題ありません。しかし、後でもう一度サインインすると、このエラーが発生する可能性があります。

インフラストラクチャに App Engine を使用しています。これは、dev_appserver とデプロイされた App Engine の両方で発生し、JavaScript gitkit ライブラリを使用するデスクトップ ブラウザと Objective C gitkit ライブラリを使用する iOS アプリの両方で発生します。(iOS で dev_appserver に対してテストしたことはありません。デプロイのみです。)

私が使用しているコードは次のようになります。

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

スタック トレースは次のとおりです (上記の行から始まります)。

  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

「プレーンテキストが大きすぎます」というエラーは、ペイロードのサイズが RSA キーのサイズを超えた場合にのみ発生します。2048 ビットの RSA キーに対して SHA256 ハッシュを検証しているので問題ないはずですが、googleapis.com からのキーの読み込みに問題がある場合があるのではないかと考えています。私の次のステップは、API 統計モジュールを使用して、これが発生したリクエストで urlfetch 呼び出しを探し、_pycrypto_crypt.py を拡張して、検証しようとしている RSA キーをログに記録することです。しかし、ここで Stack Overflow をチェックして、誰かがすでにこの道をたどっているかどうかを確認しようと思いました.

更新: ログを追加して、いくつかのことを学びました。まず、JWT ヘッダーで指定されたキー ID を使用するのではなく、gitkit API (またはそれが使用するライブラリの 1 つ) は、Google Identity Toolkit キーセットの各キーを繰り返し試行します。第二に、十分なログを記録していたときにエラーが発生した場合、実際にはキーセットにあるキーの 1 つをテストしているため、キーのロードに関する私の理論は無効になります。しかし、実際には 2048 ビットのキーに対して 256 バイトの文字列を検証しようとしているので、まったく問題ないはずです。

最後に、通常はすべてのキーを反復処理しますが、このエラーが発生したときは、最初に試行したキーでエラーが発生します。これは、場合によっては、壊れた pycrypto を早い段階でインポートしているのではないかと思います。

バックトレースからわかるように、私は Google 提供の pycrypto を使用していますが、ローカルでコンパイルされたものが私のアプリの "lib" ディレクトリ (sys.path にあります) にあり、Google で販売したときにそこに保存されました。アイデンティティ ツールキット。

4

1 に答える 1