繁体   English   中英

pyOpenSSL 的 PKCS7 对象提供的信息非常少,如何在签名中获取公钥的 sha1 摘要

[英]pyOpenSSL's PKCS7 object provide very little information, how can I get the sha1 digest of the public key in the signature

我想在 Python 中解析 android apk 的 CERT.RSA。 我知道它可以用 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 对象不完整,我无法获得我需要的属性,有没有其他方法可以解析该文件?

评论:我不知道是否有办法将其转换为另一种格式以便对其进行解析

您可以使用opensslPKCS#7转换为PEMPEM可使用PyOpenSSL读取

openssl pkcs7 -print_certs -in sample.p7b -out sample.cer

问题:...如何在签名中获取公钥的 sha1 摘要

它没有实现,Pull Request 自 2015 年以来就停滞不前。
使用 Pull Request 中的代码,您可以做到这一点。

来自:GitHub pyca/pyopenssl:为 pkcs#7 证书、crl 和数据实施 getter #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) # According to comment from @ Jari Turkia # to prevent segfaults use '_lib.X509_dup(' pycert._x509 = _lib.X509_dup(_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)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM