6

この質問以来、pyOpenSSLは署名の検証のサポートを開始したと思います(pyOpenSSL 0.11以降) 。

私はM2Cryptoを使用して他の誰かによって開始されたプロジェクトに取り組んでいます。M2Cryptoは、 SWIGを使用する必要があるため、Herokuなどのプラットフォームに含めるのは非常に困難です。その結果、私はM2Cryptoへの依存を取り除き、Pip経由で簡単にインストールできるpyOpenSSLに置き換えようとしています。これは、カスタムビルドパックなど、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に提供している値が実際には使用されているはずの値ではないため、失敗しているのかわかりません。

私が遊んでいた元のコードはここにあり、片付けるにはかなりの作業が必要ですが、完全なリファクタリングの前に機能を置き換えて、一度に1ステップずつ実行しようとしていました。どんなポインタでも大歓迎です!pyOpenSSLには、ここでM2Crypto機能を置き換える機能がありますか?それは正しい方法で行っていますか?

4

1 に答える 1

8

したがって、答えは、 exarkunからのポインタを使用して、pyOpenSSLのソースをもう少し読むことから得られます。pyOpenSSLは、実際にここでM2Cryptoの依存関係を置き換えることができますが、基礎となるコードにごくわずかな変更を加えるだけです。

ここでのcrypto.verify()関数の単体テストは、次の呼び出しを行っていることを示しています。

verify(good_cert, sig, content, digest)

その結果、上記のコードにエラーが発生しました。

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

署名が生データ文字列に適用されたため、ハッシュではなく単に「データ」を取得する必要がありました。

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

この動作は、ハッシュされたデータ文字列を使用して検証を実行するM2Cryptoの検証の動作とは異なるように見えます。何が起こっているのかを理解するために、M2Cryptoの関数を特に深く掘り下げていないことに注意してください。

pyOpenSSLメーリングリストでのexarkunの応答に感謝します。これは、verify()が何をしているかを理解するのではなく、verify()の呼び出しにエラーがあることを示していました。

于 2012-08-31T17:54:05.640 に答える