2016-08-02 66 views
0

我試圖讓我的內容有時間戳,所以我知道它何時更改。首先我使用了一個shell腳本,但我想在我的python程序中實現它。 shell腳本現在工作正常,但我不能讓python版本爲我工作。 這是工作外殼版本python rfc3161驗證失敗,但openssl驗證無誤

in_file='test_content' 
out_file="${in_file}.tsr" 
ts_server='http://time.certum.pl/' 
openssl ts -query -data "$in_file" -sha1 -cert | curl -o "$out_file" -sSH 'Content-Type: application/timestamp-query' --data-binary @- "$ts_server" 
openssl ts -verify -data "$in_file" -in "$out_file" -CAfile "/usr/lib/ssl/certs/Certum_Trusted_Network_CA.pem" 
openssl ts -reply -in "$out_file" -text 

我試着用rfc3161 package模仿這一點,但如預期的驗證不走了。這是Python代碼

import rfc3161 

cert = file('/usr/lib/ssl/certs/Certum_Trusted_Network_CA.pem').read() 
rt = rfc3161.RemoteTimestamper('http://time.certum.pl/', certificate=cert) 
data_to_sign = file('test_content').read() 
print rt.timestamp(data=data_to_sign) 
>>> (False, 'Bad signature') 

我不知道什麼是錯誤的,因爲這兩個腳本應該做同樣的事情。有人可以給我一個關於python版本有什麼問題的線索嗎?

回答

0

問題在於我使用的庫rfc3161。似乎作者不包括檢查TSA授權證書,所以我必須對圖書館進行更改。

更改後的代碼位於api.pycheck_timestamp函數中。您必須更改用此證書加載的代碼塊:

編輯: 響應中的證書應針對某些證書存儲進行驗證。如果您無法驗證它ü應該拋出一個異常

if certificate != "": 
    try: 
     certificate = X509.load_cert_der_string(encoder.encode(signed_data['certificates'][0][0])) 
     # YOU SHOULD VALIDATE THE CERTIFICATE AGAINST SOME CERTIFICATE STORE !!!! 
     if not validate_certificate(certificate): #NOTE: I am not ready with this function. 
      raise TypeError('The TSA returned certificate should be valid one') 
    except: 
     raise AttributeError("missing certificate") 
else: 
    try: 
     certificate = X509.load_cert_string(certificate) 
    except: 
     certificate = X509.load_cert_der_string(certificate) 

EDIT2:進行驗證你可以使用代碼來描述here

現在的核查工作正常。

0

python-rfc3161的作者在這裏。如果返回的簽名不正確,這意味着您爲TSA聲明的證書不是真正用於簽名的證書。

由melanholly提供的補丁似乎對我來說不正確,您不應該使用與簽名捆綁在一起的證書來檢查您是否無法驗證其來源(例如使用PKI)。在這裏似乎並不是這樣。

+0

你是對的我需要先驗證證書然後驗證TSA答案。我會將其添加到原始帖子中。謝謝 – melanholly