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

问题描述 投票:0回答:2

我创建了一个 Firefox 插件,一个 Win32 本地代码 DLL - 使用 Firebreath。我正在 Windows 7/x64 上工作,并且仅针对 Windows。该插件本身运行良好,但我真的很难获得“正确”签名的 XPI。如果我不签署我的 XPI,FF 3.6 至 10(测试版)就会接受并安装它。当然,在安装过程中,它会将发布者列为(作者未验证)。所以,我花了一周时间调试签名过程...但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


firefox firefox-addon code-signing xpi
2个回答
3
投票

因此,本质上,每个证书颁发机构都具有 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


2
投票
bug 602107

),因为默认情况下该链也会结束很快。 您的 XPI 当前已使用您的证书进行签名,不包含进一步的证书链,依赖于用户的浏览器将立即信任您的证书的颁发者。您可以使用 Mozilla 的

jarsigner

工具检查这一点(请参阅

Mozilla NSS 工具
): 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]

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

使用 Mozilla 的
    certutil
  1. 工具从证书数据库中删除未明确信任的 VeriSing 内置证书
    构建您的证书的证书信任链,一直到微软的“3级公共主要证书颁发机构”。
  2. 签署 xpi(这次完整的证书链将包含在签名中)
  3. 如上所述使用
  4. jarsigner
  5. 验证 xpi
    在 Firefox 中测试 xpi - 您不应该再看到“
  6. 作者未验证
  7. ”。
  8. 注意事项:

内置 Firefox 证书存储中的信任位实际上是 3 状态(受信任、不受信任和未知),尽管在 FF GUI 中仅显示为 2 状态复选框(选中=受信任、未选中=不受信任
    OR
  • 未知) 。默认情况下,信任为“未知”,这使您能够按照所述绕过 VeriSign 的证书。如果您曾经通过 FF 的复选框启用了信任,它仍然可以工作,但如果您取消选中信任复选框,信任将设置为“不可信”,这将防止绕过链中的该证书。将其重置回初始未知状态的最简单(唯一?)方法是删除您的 Firefox 配置文件。 在 Mozilla 最终启用代码签名信任位(参见上面的错误)后,如果您想支持旧版本的 Firefox,您仍然需要像这样进行签名。 希望有帮助!
© www.soinside.com 2019 - 2024. All rights reserved.