Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asn.1 从(ASN1)mozilla.rsa文件中提取扩展名id_Asn.1_Firefox Addon Webextensions - Fatal编程技术网

Asn.1 从(ASN1)mozilla.rsa文件中提取扩展名id

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

如何从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)
给予

回溯(最近一次呼叫最后一次):
文件“”,第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结构,但您仍然需要查找您感兴趣的证书。我已经编辑了答案,并提供了一些详细信息。