2016-05-12 58 views
1

我有下面的代碼完美地適用於簽名字符串。不過,我現在需要編程簽署並以同樣的方式得到一個文件的簽名,我會在命令行使用python和pyopenssl簽署文件/文件對象

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

使用OpenSSL。

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 

如果打開一個文件,並嘗試登陸:

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

的OpenSSL拋出一個錯誤:

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

如何簽署該文件對象?

回答

0

該錯誤指出,當需要字符串或只讀緩衝區時,您正在傳遞文件實例。嘗試用the_file.read()替換the_file。

備註:如果您正在嘗試加密和/或簽名文件,請看支持的Cryptographic Message Syntax(CMS)。 This article將引入SignedData內容類型,我認爲這是你真正的追求。