Firefox在成功签名的XPI上忽略了签名 - 如何诊断?

时间:2012-01-09 15:31:19

标签: firefox firefox-addon code-signing xpi

我使用Firebreath创建了一个Firefox插件,一个Win32原生代码DLL。我正在使用Windows 7 / x64,仅针对Windows。该插件本身运行良好,但我真的很难得到正确签名的XPI。如果我没有签署我的XPI,它将被FF 3.6至10(beta)接受并安装。当然,在安装过程中,它会将发布者列为(作者未经过验证)。所以,我花了一个星期调试签名过程......但FF 9和10仍然说(作者未经过验证)! FF 3.6拒绝签名的XPI无效。

如何解决此问题?

重复一遍:我签署了没有错误的xpi,并且生成的XPI在FF 9和10上成功安装,但FF仍然说(作者未经过验证)

这是我用来签署XPI的批处理代码:

echo * clean out old signing folder and xpi
if exist package rmdir /S /Q package
if exist %package%.xpi del %package%.xpi
echo * copy in files for package
md package
xcopy ..\*.rdf package
md package\plugins
xcopy ..\build\bin\Plugin\Debug\*.dll package\plugins
echo * clean out certificate database
del *.db
echo * import our signing certificate
pk12util -d . -i %keyfile% -K %pwd% -w keypass.txt
echo * adjust trust on base, intermediate and root cert
certutil -M -d . -n "VeriSign" -t "c,c,C"
certutil -M -d . -n "VeriSign Class 3 Code Signing 2010 CA - VeriSign, Inc." -t "TC,TC,TC"
certutil -M -d . -n "%certname%" -t "u,u,Cu"
certutil -L -d .
echo * create signed package
signtool -d . -X -Z %package%.xpi -k "%certname%" -p %pwd% package

2 个答案:

答案 0 :(得分:3)

我为Mozilla工作,但这不是一个权威的答案,只是我收集的问题:

因此,基本上,每个证书颁发机构都有三个信任位Mozilla可能会授予它:他们可能信任它来签署网站,和/或邮件和/或代码。您的证书来自Mozilla不信任签署代码的证书颁发机构。 (这就是为什么在您的偏好设置中手动设置该位使其适用于您。)

我被告知很少有人尝试在xpi中使用二进制代码,因为Mozilla并没有真正有条理地找出哪些权限可用于什么。但是,您可以查看此列表:查看“代码信任位”:

https://spreadsheets.google.com/pub?key=ttwCVzDVuWzZYaDosdU6e3w&single=true&gid=0&output=html

例如(完全随机选取),ComSign Secured CA设置了“网站”和“代码”信任位。

我认为Mozilla公开讨论了授予每个CA的权利,并定期重新评估每个CA:

https://wiki.mozilla.org/CA:Schedule#Queue_for_Public_Discussion

答案 1 :(得分:2)

基本上,您的签名需要包含完整的证书链,直至受信任的VeriSign根证书,绕过具有未知信任的“VeriSign Class 3公共主要证书颁发机构 - G5”(默认为bug 602107)链条结束太快了。

您的XPI目前已使用您的证书进行签名,不再包含证书链,依赖于用户的浏览器会立即信任您的证书颁发者。您可以使用Mozilla的jarsigner工具(请参阅Mozilla NSS tools):

进行检查
Tools\nss-3.11>jarsigner -verify -verbose -certs my-old.xpi
    2057 Thu Sep 15 15:17:44 CEST 2011 META-INF/zigbert.rsa
sm        87 Thu Sep 15 15:17:44 CEST 2011 chrome.manifest

  X.509, CN=Company Name inc., OU=General, OU=Digital ID Class 3 - Microsoft Software Validation v2, O=Company Name inc., L=City, ST=State, C=XX
  [certificate will expire on 26.4.13 0:59]

(仅显示第一个文件的输出)

您需要包含更多证书才能完成证书,该证书默认在最终用户的浏览器中明确受信任。最后它应该是这样的:

jarsigner -verify -verbose -certs my-newly-signed.xpi

    2057 Thu Sep 15 15:17:44 CEST 2011 META-INF/zigbert.rsa
sm        87 Thu Sep 15 15:17:44 CEST 2011 chrome.manifest

  X.509, CN=Company Name inc., OU=General, OU=Digital ID Class 3 - Microsoft Software Validation v2, O=Company Name inc., L=City, ST=State, C=XX
  [certificate will expire on 26.4.13 0:59]
  X.509, CN=VeriSign Class 3 Code Signing 2010 CA, OU=Terms of use at https://www.verisign.com/rpa (c)10, OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US
  [certificate is valid from 8.2.10 1:00 to 8.2.20 0:59]
  [KeyUsage extension does not support code signing]
  X.509, CN=VeriSign Class 3 Public Primary Certification Authority - G5, OU="(c) 2006 VeriSign, Inc. - For authorized use only", OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US
  [certificate is valid from 8.11.06 1:00 to 8.11.21 0:59]
  [KeyUsage extension does not support code signing]
  X.509, OU=Class 3 Public Primary Certification Authority, O="VeriSign, Inc.", C=US
  [certificate is valid from 23.5.06 19:01 to 23.5.16 19:11]

要实现这一目标,您需要:

  1. 使用Mozilla的certutil工具
  2. 从证书数据库中删除未明确信任的VeriSing内置证书
  3. 构建证书的证书信任链,一直到Microsoft的“Class 3 Public Primary Certification Authority”。
  4. 签署xpi(这次完整的证书链将包含在签名中)
  5. 如上所述使用jarsigner验证xpi
  6. 在Firefox中测试xpi - 您不应再看到“作者未经过验证”。
  7. 警告:

    • 内置Firefox证书存储区中的信任位实际上是3状态(可信,不可信和未知),尽管在FF GUI中仅显示为2状态复选框(已检查=可信,未检查=不可信未知)。默认情况下,信任是未知,这使您可以绕过VeriSign的证书,如上所述。如果您通过FF的复选框启用了信任,它仍然有效,但如果您取消选中信任复选框,则信任将设置为不信任,这将阻止绕过链中的该证书。将此重置为初始未知的最简单(唯一?)方法是删除您的firefox配置文件。
    • 在Mozilla最终启用代码签名信任位(请参阅上面的错误)之后,如果您想支持旧版本的Firefox,您仍需要这样签名。

    希望它有所帮助!