5

Я иногда - но не всегда - получаю сообщение об ошибке из Google Identity Toolkit с надписью «Plaintext too large». Кажется, что он находится в разделе, когда он должен пытаться проверить подпись (используя RSA). Поскольку он проверяет хэш хэш SHA256 полезной нагрузки, не должно быть никаких различий в размере открытого текста.Прерывистая (но часто встречающаяся) ошибка проверки подлинности Google Identity Toolkit: «Plaintext too large»

Если я вхожу маркер, он пытается использовать, и дать, что отладчик на https://jwt.io/, вместе с сертификатом Google RSA (от https://www.googleapis.com/identitytoolkit/v3/relyingparty/publicKeys, используйте идентификатор ключа, который jwt.io ставит в красном поле в верхней части под «ребенок»), он говорит, что подпись действительна.

Это только часть времени, возможно, чуть более половины. Если я повторю аутентификацию, это кажется прекрасным.

Это похоже только на новые аутентификации; если он уже прошел проверку подлинности, все работает нормально, хотя в настоящее время я не использую cookie сеанса: мой код проверяет аутентификацию gtoken для каждого запроса. Когда я войду, все будет хорошо, пока я не выйду (опять же, через gitkit). Но тогда, если я позже войду снова, я, вероятно, ударил бы эту ошибку.

Я использую App Engine для своей инфраструктуры. Это происходит как с dev_appserver, так и с развернутым App Engine, и с обоими браузерами на рабочем столе с использованием библиотеки gitkit JavaScript и приложения iOS с использованием библиотеки Objective C gitkit. (. Я не тестировал с прошивкой против 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 

ошибка «Plaintext слишком большой» должно происходить только тогда, когда размер полезной нагрузки превышает размер ключа RSA. Поскольку он проверяет хэш SHA256 на 2048-битный RSA-ключ, это должно быть хорошо, поэтому мне интересно, есть ли проблема с загрузкой ключа с googleapis.com. Следующим шагом будет использование модуля статистики API для поиска вызовов urlfetch в запросах, где это происходит, и для увеличения _pycrypto_crypt.py для регистрации ключа RSA, который он пытается проверить. Но я подумал, что я проверил бы здесь в Stack Overflow и посмотрю, пошел ли кто-нибудь по этому пути.

Обновление: с некоторыми дополнительными протоколами я узнал несколько вещей. Во-первых, вместо использования идентификатора ключа, указанного в заголовках JWT, API-интерфейс gitkit (или одна из библиотек, которые он использует) выполняет итерацию каждого ключа в наборе инструментов Google Identity Toolkit. Во-вторых, когда я получил ошибку в то время, когда у меня было достаточно регистрации, она тестировала один из ключей, который действительно находится в наборе ключей, так что это лишает мою теорию проблем с загрузкой ключей. Но он действительно пытается проверить 256-байтовую строку на 2048-битный ключ, так что это должно быть прекрасно.

Наконец, хотя он обычно выполняет итерацию по всем клавишам, в то время, когда я получаю эту ошибку, она попадает на ошибку на первом ключе, который она пытается. Это заставляет меня задуматься, если в некоторых случаях я импортирую разбитый pycrypto на ранней стадии.

Как вы можете видеть из backtrace, я использую Pycrypto, поставляемый Google, хотя в моем каталоге «lib» (который находится в sys.path) есть локально скомпилированный каталог, который был сохранен там, когда я представленный в Инструменте Google Identity Toolkit.

+1

У меня точно такая же проблема тоже (с одинаковыми сообщениями об ошибках) .. любые обновления о том, где вы находитесь ? – Dennis

+0

Испытывая ту же проблему. Вы нашли решение? –

+1

@ Сони Кадаван. Боюсь, что нет. Я добавил код в PyCryptoVerifier.verify и поставил блок try: catch. Теперь он вернет False на ValueError вместо распространения ошибки. Кажется, это рабочий процесс, но я не доволен этим. – Piquan

ответ

0

PyCrypto is deprecated and discouraged to be used by the maintainer.
Если вы используете стандарт GAE, вы все равно можете полагаться на собственный SSL-протокол Python.

Иногда я испытывал эту ошибку. Как вы очень хорошо заявили, это связано с тем, что PyCrypto выполняет итерации по всем возможным ключам в наборе ключей, поэтому в зависимости от заказа вы можете нажать клавишу, достаточно большую для исчерпания ожидаемых ресурсов для нее, как указано в one of the issues referring to it.

Я работаю с ssl: 2.7.11 какое-то время без проблем. Если вы хотите попробовать его и не имеют внутреннюю зависимость к PyCrypto, обновляете app.yaml к:

- name: ssl 
    version: "2.7.11"