间歇性(但经常)Google Identity Toolkit验证错误:"明文太大"

Piq*_*uan 5 google-cloud-platform google-identity-toolkit google-identity

我有时 - 但并非总是 - 从Google身份工具包中收到"明文太大"的错误.它似乎在应该尝试验证签名的部分(使用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应用程序都会发生这种情况.(我没有针对dev_appserver使用iOS测试,仅在部署中.)

我正在使用的代码如下所示:

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

堆栈跟踪如下(从上面引用的行开始):

  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
Run Code Online (Sandbox Code Playgroud)

只有当有效负载的大小超过RSA密钥的大小时,才会出现"明文太大"的错误.因为它正在验证针对2048位RSA密钥的SHA256哈希,所以应该没问题,所以我想知道从googleapis.com加载密钥是否有问题.我的下一步是使用API​​ stats模块在发生这种情况的请求中查找urlfetch调用,并增加_pycrypto_crypt.py以记录它尝试验证的RSA密钥.但是我想我会在Stack Overflow上查看,看看是否有人已经沿着这条路走下去了.

更新:通过一些额外的日志记录,我学到了一些东西.首先,gitkit API(或其使用的库之一)不是使用JWT头中指定的密钥ID,而是迭代尝试Google Identity Toolkit密钥集中的每个密钥.其次,当我遇到错误时,我已经有足够的日志记录,它一直在测试密钥集中真正存在的密钥之一,这使我关于加载密钥的问题的理论无效.但它确实试图验证一个256字节的字符串对2048位密钥,所以它应该是完全正常的.

最后,虽然它通常遍历所有键,但在我收到此错误的时候,它会在它尝试的第一个键上遇到错误.这让我想知道,在某些情况下,我是否会在早期导入破碎的pycrypto.

正如你从回溯中看到的那样,我正在使用谷歌提供的pycrypto,虽然在我的应用程序的"lib"目录(在sys.path中)有一个本地编译的,当我在谷歌出售时,它被保存在那里身份工具包.

Jos*_*gia 0

PyCrypto 已被弃用,维护者不鼓励使用
如果您使用 GAE Standard,您仍然可以依赖本机 Python 的 SSL。

我曾经偶尔遇到过这个错误。正如您所说,它与 PyCrypto 迭代键集中所有可能的键这一事实有关,因此根据顺序,您可能会击中一个足够大的键以耗尽其预期资源,如其中之一所述问题指的是它

我已经使用 ssl: 2.7.11 一段时间了,没有出现任何问题。如果您想尝试一下并且对 pyCrypto 没有内在依赖性,请将您的更新app.yaml为:

 - name: ssl
   version: "2.7.11"
Run Code Online (Sandbox Code Playgroud)