2016-05-12 27 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をthe_file.read()に置き換えてみてください。

サイドノート:ファイルを暗号化または署名する場合は、Cryptographic Message Syntax(CMS)をご覧ください。これはctypescryptoでサポートされています。 This articleはSignedDataコンテンツタイプを紹介します。これはあなたが本当に後になったものだと思います。