2012-08-27 123 views
6

我相信,因爲這question,pyOpenSSL已經開始支持簽名(覈查爲pyOpenSSL 0.11驗證簽名與pyopenssl

我在其上使用M2Crypto別人啓動了一個項目工作。M2Crypto真的很痛因爲它需要使用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實際上不是什麼是應該用於!

我一直在玩的原始代碼是here,需要相當多的工作來整理,但一直試圖在整個重構之前一次替換功能。任何指針將非常感激! pyOpenSSL能否在這裏取代M2Crypto的功能,我是否正確地做了這件事?

回答

7

所以答案來自於閱讀更多的pyOpenSSL的來源,從exarkun指針。 pyOpenSSL確實可以替代這裏的M2Crypto依賴,只需對底層代碼進行很小的修改。

的單元測試的crypto.verify()函數here顯示通話服用:

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的功能,以確定發生了什麼。

感謝exarkun他上向我指出錯誤在我的電話驗證(爲pyOpenSSL mailing list)的反應,而不是我的什麼驗證理解()在做什麼。