从 (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
这里的主要问题是我正在做一些糟糕的事情来获得标记行中的字符串,但除此之外我不认为你能做得更好。
如果您知道如何正确获取字符串,请分享。
如何从 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
这里的主要问题是我正在做一些糟糕的事情来获得标记行中的字符串,但除此之外我不认为你能做得更好。
如果您知道如何正确获取字符串,请分享。