Подтвердить подпись с помощью pyopenssl

Я считаю, что с этого вопроса pyOpenSSL начал поддерживать проверку подписей (по pyOpenSSL 0.11 .

Я работаю над проектом, который был запущен кем-то другим, использующим M2Crypto . M2Crypto действительно больно включать на такие платформы, как Heroku, поскольку для этого требуется использование SWIG . Следовательно, я пытаюсь удалить зависимость от M2Crypto и заменить pyOpenSSL, который легко установить через Pip, и не требует пользовательских buildpacks и больше того, что связано с SWIG.

Проблема, с которой я сталкиваюсь, заключается в замене кода:

key = cert.get_pubkey() # Cert is an M2Crypto X509 object key = key.get_rsa() ret = key.verify(hashed, self.sig) if ret != 1: # Cert invalid ... etc. 

В идеале я хотел бы реализовать ту же функциональность с помощью pyOpenSSL, но чувствую, что у меня, возможно, был неправильный конец палки – я пробовал использовать:

 crypto.verify(cert, self.sig, hashed, 'sha1') 

Но это не удается –

 [('rsa routines', 'RSA_verify', 'bad signature')] 

Я не могу понять, происходит ли это из-за сбоя, потому что подпись на самом деле плохая, или потому что значения, которые я предоставляю crypto.verify, на самом деле не являются тем, для чего он должен использоваться!

Исходный код, с которым я играл, здесь, и требует довольно много работы, чтобы прибрать, но пытался сделать это за один шаг, заменив функциональность до полного рефакторинга. Любые указатели были бы высоко оценены! Имеет ли pyOpenSSL возможность заменить функциональность M2Crypto здесь, и я собираюсь сделать это правильно?

    Поэтому ответ приходит от чтения немного больше из источника pyOpenSSL с указателем от exarkun . pyOpenSSL действительно может заменить зависимость M2Crypto здесь, с очень незначительными изменениями в базовом коде.

    Функция unittest для функции crypto.verify () здесь показывает вызов:

     verify(good_cert, sig, content, digest) 

    Следовательно, в моем вышеприведенном коде была ошибка:

     crypto.verify(cert, self.sig, hashed, 'sha1') 

    Который должен был просто взять «данные», а не хэшировать, поскольку подпись была применена к исходной строке данных:

     # NB cert = X509 object (from crypto.load_certificate()) crypto.verify(cert, self.sig, data, 'sha1') 

    Это поведение отличается от поведения M2Crypto, которое выполняет хешированную строку данных для выполнения проверки. Примечание. Я не очень глубоко вырыл в функции M2Crypto, чтобы выработать то, что происходит.

    Благодаря exarkun за его ответ на список рассылки pyOpenSSL, который указал мне на ошибку в моем вызове verify (), а не на мое понимание того, что делает verify ().