【发布时间】:2017-07-07 02:43:33
【问题描述】:
已经有很多问题了,但问题是,他们都没有足够的答案如何做到这一点,尤其是在使用 python3 时。
基本上,我想读取 JAR/APK 证书,比如这个:Link to ASN1 Decoder, with Android Test Signing Key
现在有几种选择:
- pyasn1:似乎可以,但只能解析原始 ASN.1 格式
- M2Crypto:仅适用于 py2
- Chilkat:不是免费的,虽然 CkCert 似乎是免费的
- 密码学:无法加载证书,因为 X509 证书位于 PKCS#7 容器内
我找到了一种使用 pyasn1 从 pkcs#7 消息中解压缩证书的方法,然后使用密码学来读取它:
from pyasn1.codec.der.decoder import decode
from pyasn1.codec.der.encoder import encode
from cryptography import x509
from cryptography.hazmat.backends import default_backend
cdata = open("CERT.RSA", "rb").read()
cert, rest = decode(cdata)
# The cert should be located there
realcert = encode(cert[1][3])
realcert = realcert[2 + (realcert[1] & 0x7F) if realcert[1] & 0x80 > 1 else 2:] # remove the first DER identifier from the front
x509.load_der_x509_certificate(realcert, default_backend())
给了
<Certificate(subject=<Name([<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.6, name=countryName)>, value='US')>, <NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.8, name=stateOrProvinceName)>, value='California')>, <NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.7, name=localityName)>, value='Mountain View')>, <NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.10, name=organizationName)>, value='Android')>, <NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.11, name=organizationalUnitName)>, value='Android')>, <NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)>, value='Android')>, <NameAttribute(oid=<ObjectIdentifier(oid=1.2.840.113549.1.9.1, name=emailAddress)>, value='android@android.com')>])>, ...)>
有没有其他办法让它干净整洁?
【问题讨论】: