Asn.1 从(ASN1)mozilla.rsa文件中提取扩展名id
如何从xpi文件中检索扩展名ID?(全球扩展安装需要f.ex.) 在以前的版本中,您可以从不再存在于WebExtensions中的Asn.1 从(ASN1)mozilla.rsa文件中提取扩展名id,asn.1,firefox-addon-webextensions,Asn.1,Firefox Addon Webextensions,如何从xpi文件中检索扩展名ID?(全球扩展安装需要f.ex.) 在以前的版本中,您可以从不再存在于WebExtensions中的install.rdf中获得它。说明它包含在META-INF/mozilla.rsa文件中 在python中,有pyasn1库。第一次尝试时,我无法让它工作: from pyasn1.codec.der import decoder f = open('/path/to/addon-dir/META-INF/mozilla.rsa') decoder.decode(f
install.rdf
中获得它。说明它包含在META-INF/mozilla.rsa
文件中
在python中,有pyasn1库。第一次尝试时,我无法让它工作:
from pyasn1.codec.der import decoder
f = open('/path/to/addon-dir/META-INF/mozilla.rsa')
decoder.decode(f)
给予
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python2.7/dist packages/pyasn1/codec/ber/decoder.py”,第623行,在调用中__
raise error.PyAsn1Error('Bad octet stream type')
pyasn1.error.PyAsn1Error:八位字节流类型错误
这项技术奏效了:
openssl asn1parse -inform DER -in mozilla.rsa | grep -A 1 commonName | grep '{' | cut -d ':' -f 4
它依赖于
的输出,以及asn1parse
- 唯一带有
的commonName属于id{
openssl asn1parse -inform DER -in mozilla.rsa | grep -A 1 commonName | grep '{' | cut -d ':' -f 4
它依赖于
的输出,以及asn1parse
- 唯一带有
的commonName属于id{
任何更优雅的东西都值得欣赏。解码方法需要缓冲区(字符串),而不是文件对象。使用:
from pyasn1.codec.der import decoder
buf = open('/path/to/addon-dir/META-INF/mozilla.rsa').read()
decoder.decode(buf)
为我工作
编辑:
pyasn1_modules
包包含表示一些常见PKCS结构的类。您可以从以下内容开始:
from pyasn1.codec.der import decoder as der_decoder
from pyasn1_modules import rfc5652, rfc2315, rfc5280
mozPath = "/path/to/mozilla.rsa"
buf = open(mozPath,"rb").read()
contentInfo = der_decoder.decode(buf, asn1Spec=rfc5652.ContentInfo())[0]
if contentInfo[0] != rfc2315.signedData:
# fail...
signedData = der_decoder.decode(contentInfo[1], asn1Spec=rfc5652.SignedData())[0]
print(signedData.prettyPrint())
这会产生类似于mozilla.rsa中的openssl asn1parse-inform DER-的输出(我自己更喜欢pyasn1
的缩进而不是openssl
的“d=depth”。)
如果您想使用pyasn1
进一步解析它,可以尝试以下方法:
for cert in signedData["certificates"]:
subject = cert["certificate"]["tbsCertificate"]["subject"]
for rdn in subject["rdnSequence"]:
if rdn[0][0] == rfc5280.AttributeType("2.5.4.3"):
cn = rdn[0][1].asOctets()[2:] ### Not nice
if cn != "production-signing-ca.addons.mozilla.org":
print cn
这里的主要问题是,我正在做一些非常糟糕的事情来让字符串进入标记行,但除此之外,我不认为你能做得更好
如果您找到了正确获取字符串的方法,请共享。解码方法需要缓冲区(字符串),而不是文件对象。请使用:
from pyasn1.codec.der import decoder
buf = open('/path/to/addon-dir/META-INF/mozilla.rsa').read()
decoder.decode(buf)
为我工作
编辑:
pyasn1_modules
包包含表示一些常见PKCS结构的类。您可以从以下内容开始:
from pyasn1.codec.der import decoder as der_decoder
from pyasn1_modules import rfc5652, rfc2315, rfc5280
mozPath = "/path/to/mozilla.rsa"
buf = open(mozPath,"rb").read()
contentInfo = der_decoder.decode(buf, asn1Spec=rfc5652.ContentInfo())[0]
if contentInfo[0] != rfc2315.signedData:
# fail...
signedData = der_decoder.decode(contentInfo[1], asn1Spec=rfc5652.SignedData())[0]
print(signedData.prettyPrint())
这会产生类似于mozilla.rsa中的openssl asn1parse-inform DER-的输出(我自己更喜欢pyasn1
的缩进而不是openssl
的“d=depth”。)
如果您想使用pyasn1
进一步解析它,可以尝试以下方法:
for cert in signedData["certificates"]:
subject = cert["certificate"]["tbsCertificate"]["subject"]
for rdn in subject["rdnSequence"]:
if rdn[0][0] == rfc5280.AttributeType("2.5.4.3"):
cn = rdn[0][1].asOctets()[2:] ### Not nice
if cn != "production-signing-ca.addons.mozilla.org":
print cn
这里的主要问题是,我正在做一些非常糟糕的事情来让字符串进入标记行,但除此之外,我不认为你能做得更好
如果您找到了正确获取字符串的方法,请与他人分享。很抱歉,接受时间太晚。我以前没有时间测试它。有没有比使用解码器更简单的方法呢。解码(buf)[0][1][3][0][5][5][0][1]。asOctets()
?@serv inc:定义“更简单”。有一些类可以帮助您解析PKCS结构,但您仍然需要查找您感兴趣的证书。我已经用一些详细信息编辑了答案。很抱歉,我迟了接受。我以前没有时间测试它。有没有比执行解码器。解码(buf)[0][1][3][0][5][0][1]更简单的方法呢。asOctets()
?@serv inc:Define“easer”。有一些类可以帮助您解析PKCS结构,但您仍然需要查找您感兴趣的证书。我已经编辑了答案,并提供了一些详细信息。