我能够使用从 nss-3.13.6 版本编译的 nsscapi.dll 拼凑出一个解决方案。然后,我将其他库依赖项复制到我的 nss-3.20 构建中,以用于我的整体应用程序。
nsscapi.dll 用于签署一段代码,是 NSS 的基本 PKCS11 到 Capi 模块接口。它显然存在内存泄漏问题,但由于我使用 NSS 的范围只是偶尔签署一个 XPI 文件,我可以偶尔重新启动该模块。
解决方案包括:使用 mozilla-build 构建的 nss-3.20,以及来自此包的“nss”子文件夹中的“make nss_build_all”。
Visual Studio C++ Redistributable 2015 x86 版本(32 位作为 64 位不适用于此项目)。
Thales CAPI 与 Windows 的接口(是的,它们有一个直接的 PKCS11 模块,但对于我的自定义环境,只有 CAPI 和 Java 密钥库是选项,所以我没有使用 Thales PKCS11 模块)
PATH 环境变量已修改为指向 NSS 构建中的 bin 和 lib 文件夹。
nsscapi.dll 位于 nss-3.20\dist\WIN95xxx\lib\ 文件夹中,使用“modutil”加载到 NSS 构建中:
modutil -dbdir "c:\apps\certs" -add "capi" -libfile "C:\Apps\nss-3.20\dist\WIN954.0_DBG.OBJ\lib\nsscapi.dll" -mechanisms RSA:DSA:RC2:RANDOM
我已经将 Thales 配置为将代码签名证书填充到 CAPI,因此我已经在 CAPI 中拥有了代码签名证书。
我必须使用 mmc.exe 中的“证书”管理单元来查看当前用户的“个人”证书存储。然后将我想使用的代码签名证书的“友好”名称修改为有意义的名称,例如“测试”。这样 NSSCAPI 模块可以在列表中唯一地识别该证书,该列表具有可见性。
在我的一个测试代码签名证书上更改友好名称的步骤之后,我使用 NSS 签名工具来显示可用证书的列表:
signtool -d "c:\apps\certs" -L
我将一个“test.xpi”文件解压到“c:\apps\certs”的“test”子文件夹中,这是我刚刚编的一个子文件夹名称,你可以使用你想要的。
我的清单包含一个条目:
* 表示它是一个有效的证书,可用于 NSS 中的代码签名
然后我使用 signtool 对我的测试 XPI 文件中的代码进行签名:
signtool -d "C:\Users\mlawson\AppData\Roaming\Mozilla\Firefox\Profiles\4jnnnb1y.default" -k "Microsoft Certificate Store":"test" test/
成功!
如果我对此答案的格式不正确,我提前道歉。这是我第一次同时发布到堆栈溢出,并回答一个帖子(即使它是我自己的)。我忽略了这篇文章中的一些高级步骤以保持简短,因为一些更大的“如何”做事情,比如构建 NSS,已经在 Mozilla 的网站上记录了。Thales 相关配置由 Thales 记录,与解释如何配置无关,因为我的 CAPI 接口是自定义和专有的。但是使用 nsscapi.dll 和这个解决方案的总体概念确实适用于与 MSCAPI 相关的任何东西,并且能够将其与 NSS 一起使用非常方便。nsscapi.dll 也可以作为模块加载到 firefox“安全设备”中,以便 firefox 也可以使用 CAPI,虽然我不知道到底有多好......