从 (ASN1) mozilla.rsa 文件中提取扩展 ID

Extract extension id from (ASN1) mozilla.rsa file

如何从 xpi 文件中检索扩展 ID? (全局扩展安装需要f.ex。)

在以前的版本中,您可以从 install.rdf 中获取它,它不再存在于 WebExtensions 中。 http://www.di-mgt.com.au/how-mozilla-signs-addons.html 说明它包含在 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)

给予

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/pyasn1/codec/ber/decoder.py", line 623, in __call__
    raise error.PyAsn1Error('Bad octet stream type')
pyasn1.error.PyAsn1Error: Bad octet stream type

这个技巧奏效了:

openssl asn1parse -inform DER -in mozilla.rsa  | grep -A 1 commonName | grep '{' | cut -d ':' -f 4

它依赖于

  • asn1parse
  • 的输出
  • 唯一带有 { 的 commonName 属于 id

任何更优雅的东西都值得赞赏。

decode 方法需要缓冲区(字符串),而不是文件对象。使用:

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())

这会产生类似于 openssl asn1parse -inform DER -in mozilla.rsa 的输出(我自己更喜欢 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

这里的主要问题是我正在做一些糟糕的事情来获得标记行中的字符串,但除此之外我不认为你能做得更好。

如果您知道如何正确获取字符串,请分享。