我创建了一个 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
因此,本质上,每个证书颁发机构都具有 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),因为默认情况下该链也会结束很快。 您的 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
jarsigner
内置 Firefox 证书存储中的信任位实际上是 3 状态(受信任、不受信任和未知),尽管在 FF GUI 中仅显示为 2 状态复选框(选中=受信任、未选中=不受信任