发布时间:2011-4-8 15:50
分类名称:Plugins
官方参考文章:https://developer.mozilla.org/en/Signing_a_XPI
获取NSS
官方文档比较旧,其文中建议使用的NSS版本为nss 3.11.4 with nspr 4.6。但我下载后,导入pfx的证书时会崩溃(系统为Win7)。所以不建议使用此版本。我在它的服务器上找到了比较新的版本。而且不需要下载nspr(nspr就是一些lib库,nss会使用它们),下载的nss内部已经自带。
下载的版本为 3.12.4,下面的介绍都是基于这个版本。
关于NSS工具(如certutil, signtool, pk12util等)使用说明,见Mozilla文档:
http://www.mozilla.org/projects/security/pki/nss/tools/
NSS 数据库操作
下载完,解压到c:\nss-3.12.4, 然后打开命令行,设置一下path变量:
set PATH=C:\nss-3.12.4\bin\;C:\nss-3.12.4\lib\;
在其它地方再创建一个目录,用来建立nss证书数据库,例如,这里使用:
C:\Projects\CodeSigning目录,然后建立数据库:
C:\Projects\CodeSigning\> certutil -N -d .
Enter a password which will be used to encrypt your keys.
The password should be at least 8 characters long,
and should contain at least one non-alphabetic character.
Enter new password:
Re-enter password:
“.” 表示在当前目录建立数据库。然后会提示设置数据库密码。
官方文章中有一个示例教你如何建立测试用的自签名证书,由于这个操作在实际使用中并没有什么意义,就掠过了,具体操作见参考原文。
下面介绍如何使用已经存在的pfx证书来签名XPI。
首先,也是最重要的,用来签名的XPI证书的“用途“必须是“code signing”。 然后分俩个步骤走:
1. 安装CA根证书和中间CA证书(如果有的话)
2. 安装用来签名XPI文件的证书和其密钥。
示例中的证书链为:
Certum Root CA
Certum Level III CA
Code Signing
首先,需要将Root或Intermediate CA certificate 导入到NSS数据库中:
;导入根证书
C:\Projects\CodeSigning> certutil -A -n "Certum Root CA" -t "TC,TC,TC" -d . -i "Certum Root CA.cer"
;导入中间证书
C:\Projects\CodeSigning> certutil -A -n "Certum Level III CA" -t "c,c,C" -d . -i "Certum Level III CA.cer"
;显示导入到数据库的结果
C:\Projects\CodeSigning> certutil -L -d .
myTestCert u,u,Cu
Certum Root CA CT,C,C
Certum Level III CA CT,C,C
然后导入签名证书,签名证书的名字为”TJ's Unizeto Sp. z o.o. ID”,可以为它在数据库中重新命名一个新的昵称,这个名字只是用来表示数据库对应的某个证书,并不会更改证书本来的内容。下面命名为“Code Signing (Certum)”。
;导入XPI签名需要的证书(不带私钥)
C:\Projects\CodeSigning> certutil -A -n "Code Signing (Certum)" -t "u,u,u" -d . -i "Certum Code Signing.cer"
C:\Projects\CodeSigning> certutil -L -d .
myTestCert u,u,Cu
Certum Root CA CT,C,C
Certum Level III CA CT,C,C
Code Signing (Certum) , ,
最后,导入密钥:
C:\Projects\CodeSigning> pk12util -i "Certum Code Signing.pkcs12" -d .
Enter Password or Pin for "NSS Certificate DB":
Enter password for PKCS12 file:
pk12util: PKCS12 IMPORT SUCCESSFUL
C:\Projects\CodeSigning> certutil -L -d .
myTestCert u,u,Cu
Certum Root CA CT,C,C
Certum Level III CA c,c,C
Code Signing (Certum) u,u,u
确认导入密钥后,确认此证书的属性为: u,u,u.
这样就可以用此证书来签名某个目录了。
signtool -d . -k "Code Signing (Certum)" –p “password” test
using certificate directory: .
Generating test/META-INF/manifest.mf file..
--> test.txt
Generating zigbert.sf file..
tree "test" signed successfully
此命令将test目录下的全部文件进行签名。password 为一开始新建数据库时候的密码。” Code Signing (Certum)” 为对应签名证书的“昵称”。
签名如果成功,最后会显示successfully,而且该目录下多了一个META-INF目录,里面有三个文件:
manifest.mf
zigbert.rsa
zigbert.sf
用压缩程序将其打包为zip包,更改扩展名为xpi。
最后,需要将根证书,中间件证书都导入到firefox证书系统中,然后将xpi拖到Firefox,就会发现,未验证,变成了已验证。
使用张晓龙提供的一个用途为签名软件的证书进行测试:
set PATH=E:\Projects\mozzilla\nss-3.12.4\bin\;E:\Projects\mozzilla\nss-3.12.4\lib\;%PATH%
certutil -A -n "Tianwei ca" -t "TC,TC,TC" -d . -i "tianwei_ca.cer" ;导入根证书
certutil -A -n "tianwei code" -t "u,u,u" -d . -i "tianwei_code.cer" ;导入签名证书
pk12util -i "tianwei_code.pfx" -d . ;导入密钥
E:\Projects\mozzilla\base>signtool -d . -k "tianwei code" -p password FtNpRuntimeCom
Generating FtNpRuntimeCom/META-INF/manifest.mf file..
--> FtNpRuntimeCom.xpi
--> install.rdf
--> plugins/npruntime.dll
Generating zigbert.sf file..
tree "FtNpRuntimeCom" signed successfully
End