2015-11-10 5 views
2

Мне нужно получить отдельную подпись PKCS # 7 некоторой строки в Python, используя PyOpenSSL. У меня есть ключ в файле .p12.Отключенная подпись PKCS # 7 с Python и PyOpenSSL

Пока я пытаюсь сделать так:

from OpenSSL.crypto import load_pkcs12, sign 

pkcs12 = load_pkcs12(key_dat, key_pwd) 
algo = pkcs12.get_certificate().get_signature_algorithm() 
pkey = pkcs12.get_privatekey() 
sg = sign(pkey, manifest, algo) 

Но это не то, что требуется.

Я искал сеть, но большинство примеров связано с подписью кусков электронной почты и использованием M2Crypto. Есть ли способ сделать это в чистом PyOpenSSL?

ответ

3

Функции OpenSSL PKCS # 7, которые вам нужны для этого, похоже, не экспортируются оболочкой OpenSSL Python. Вы можете попробовать сделать это с помощью внутренностей модуля криптографического, например, как в следующем фрагменте кода:

>>> with open('cleg.p12', 'r') as f: 
... p12data=f.read() 
>>> p12=crypto.load_pkcs12(p12data,'passphrase') 
>>> signcert=p12.get_certificate() 
>>> pkey=p12.get_privatekey() 
>>> bio_in=crypto._new_mem_buf(manifest) 
>>> PKCS7_DETACHED=0x40 
>>> pkcs7=crypto._lib.PKCS7_sign(signcert._x509, pkey._pkey, crypto._ffi.NULL, bio_in, PKCS7_DETACHED) 
>>> bio_out=crypto._new_mem_buf() 
>>> crypto._lib.i2d_PKCS7_bio(bio_out, pkcs7) 
1 
>>> sigbytes=crypto._bio_to_string(bio_out) 

После этого sigbytes содержит подпись, ASN.1 DER закодированного. Постоянное значение для PKCS7_DETACHED определено в заголовочном файле pkcs7.h в OpenSSL.

Как вы, наверное, знаете, любые идентификаторы, начинающиеся с _, являются внутренними для модуля crypto и не должны использоваться вами напрямую. Поэтому этот ответ предназначен только для иллюстрации. Правильное решение (с правильным управлением памятью) должно быть добавлено к самому модулю crypto.

 Смежные вопросы

  • Нет связанных вопросов^_^