Объект PKCS7 pyOpenSSL предоставляет очень мало информации, как я могу получить sha1 дайджест открытого ключа в подписи
Я хотел бы проанализировать CERT.RSA Android Apk в Python. Я знаю, что это может быть проанализировано с pyOpenSSL
import OpenSSL
cert = OpenSSL.crypto.load_certificate (OpenSSL.crypto.FILETYPE_ASN1, open ('CERT.RSA', 'rb'). read ())
cert = OpenSSL.crypto.load_pkcs7_data(type, buffer)
Сертификат имеет тип 'OpenSSL.crypto.PKCS7'.
НО прямо сейчас объект PKCS7 не завершен, я не могу получить нужные мне атрибуты, есть ли альтернативный способ анализа этого файла?
1 ответ
Комментарии: я не знаю, есть ли способ конвертировать его в другой формат, чтобы его можно было проанализировать
Вы можете конвертировать PKCS#7
в PEM
с помощью openssl
, PEM
читается с помощью PyOpenSSL
openssl pkcs7 -print_certs -in sample.p7b -out sample.cer
Вопрос:... как я могу получить sha1 дайджест открытого ключа в подписи
Он не реализован, запрос на задержку останавливается с 2015 года.
Используя код из запроса на извлечение, вы можете это сделать.
От: GitHub pyca/pyopenssl: реализовать геттеры для сертификатов pkcs#7, crl и данных #367
def get_certificates(self): from OpenSSL.crypto import _lib, _ffi, X509 """ https://github.com/pyca/pyopenssl/pull/367/files#r67300900 Returns all certificates for the PKCS7 structure, if present. Only objects of type ``signedData`` or ``signedAndEnvelopedData`` can embed certificates. :return: The certificates in the PKCS7, or :const:`None` if there are none. :rtype: :class:`tuple` of :class:`X509` or :const:`None` """ certs = _ffi.NULL if self.type_is_signed(): certs = self._pkcs7.d.sign.cert elif self.type_is_signedAndEnveloped(): certs = self._pkcs7.d.signed_and_enveloped.cert pycerts = [] for i in range(_lib.sk_X509_num(certs)): pycert = X509.__new__(X509) pycert._x509 = _lib.sk_X509_value(certs, i) pycerts.append(pycert) if not pycerts: return None return tuple(pycerts)
Использование:
pkcs7 = crypto.load_pkcs7_data(crypto.FILETYPE_ASN1, open('signature.der', 'rb').read())
certs = get_certificates(pkcs7)
print(certs)
for cert in certs:
print('digest:{}'.format(cert.digest('sha256')))
Выход:
(<OpenSSL.crypto.X509 object at 0xf671b62c>, <OpenSSL.crypto.X509 object at 0xf671b86c>) digest:b'48:19:A4:2A:56:94:22:14:73:EC:2B:01:45:9E:0B:87:92:44:26:5E:57:AF:59:F5:4C:89:F3:79:83:14:11:A3' digest:b'25:BC:AC:86:8F:51:8B:EE:47:CC:8B:A7:78:91:7E:86:09:56:19:4B:B9:C4:10:1B:DF:13:CA:A6:54:E1:F7:4C'
Протестировано с Python:3.4.2 - OpenSSL:17.1.0 - криптография:1.9 - cffi:1.10.0
использование
OpenSSL.crypto.load_pkcs7_data(type, buffer)
Загрузите данные pkcs7 из строкового буфера, закодированного с типом type.
Тип типа должен быть либо FILETYPE_PEM, либо FILETYPE_ASN1).