2016-05-12 23 views
1

Ich habe den folgenden Code, der perfekt zum Signieren von Strings funktioniert. Allerdings muss ich jetzt programmatisch unterschreiben und eine Signatur für eine Datei in der gleichen Weise zu erhalten, wie ich OpenSSL würde auf der KommandozeileSignieren von Dateien/Dateiobjekten mit Python und Pyopenssl

e.g. openssl dgst -sha1 –sign key.pem -out sig1 file.tar 

.

import OpenSSL 
from OpenSSL import crypto 
import base64 
key_file = open("key.pem", "r") 
key = key_file.read() 
key_file.close() 
password = "password" 

if key.startswith('-----BEGIN '): 
    pkey = crypto.load_privatekey(crypto.FILETYPE_PEM, key, password) 
else: 
    pkey = crypto.load_pkcs12(key, password).get_privatekey() 
print pkey 
data = "data" 
sign = OpenSSL.crypto.sign(pkey, data, "sha256") 
print sign 

data_base64 = base64.b64encode(sign) 
print data_base64 

Wenn öffnet eine Datei und versuchen zu unterschreiben:

with open('file.tar', 'r') as the_file: 
    sign = OpenSSL.crypto.sign(pkey, the_file, "sha256") 
    the_file.write(sign) 
    the_file.close() 

OpenSSL einen Fehler wirft:

sign = OpenSSL.crypto.sign(pkey, the_file, "sha256") 
    TypeError: must be string or read-only buffer, not file 

Wie kann das Dateiobjekt unterschreiben?

Antwort

0

Der Fehler besagt, dass Sie eine Instanz der Datei übergeben, wenn eine Zeichenfolge oder ein schreibgeschützter Puffer erwartet wurde. Versuchen Sie, die Datei mit der Datei.read() zu ersetzen.

Randnotiz: Wenn Sie versuchen, Dateien zu verschlüsseln und/oder zu signieren, werfen Sie einen Blick auf Cryptographic Message Syntax (CMS), die von ctypescrypto unterstützt wird. This article führt den SignedData-Inhaltstyp ein, der meiner Meinung nach das ist, wonach Sie wirklich suchen.