2016-08-02 9 views
0

Я пытаюсь получить мой контент timestamped, поэтому я знаю, когда он был изменен. Сначала я использовал сценарий оболочки, но я хочу реализовать его в своей программе python. сценарий оболочки отлично работает, но я не могу заставить версию 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, но проверка не будет, как и ожидалось. Это код питона

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.py в check_timestamp функция. Вы должны изменить блок кода для загрузки сертификата с этим:

EDIT: Сертификата от ответа должен быть подтвержден в отношении некоторого хранилища сертификатов. Если вы не можете проверить его и должны вызвать исключение

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