2

我创建了一个 Firefox 插件,一个 Win32 原生代码 DLL - 使用Firebreath。我正在使用 Windows 7/x64,并且仅针对 Windows。该插件本身运行良好,但我真的无法获得正确签名的 XPI。如果我不签署我的 XPI,它会被 FF 3.6 到 10(测试版)接受并安装。当然,在安装过程中,它会将发布者列为(Author not verify)。所以,我花了一周时间调试签名过程……但 FF 9 和 10 仍然说(作者未验证)!FF 3.6 将签名的 XPI 视为无效而拒绝。

我该如何解决这个问题?

重复一遍:我没有错误地签署 xpi,并且生成的 XPI 在 FF 9 和 10 上成功安装,但 FF 仍然说(Author not verify)

这是我用来签署 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
4

2 回答 2

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

于 2012-01-11T00:58:20.140 回答
2

基本上,您的签名需要包括完整的证书链,直到受信任的 VeriSign 根证书,绕过在 mozilla 中具有未知信任的“VeriSign Class 3 Public Primary Certification Authority - G5”(错误 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]

为此,您需要:

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

注意事项:

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

希望能帮助到你!

于 2012-01-13T10:26:15.887 回答