我需要在Linux上对PE文件(实际上是EFI)进行数字签名和时间戳.我找到了3个用于签署PE文件的工具:pesign,osslsigncode和signcode(mono),但它似乎不适合我的需求.问题是,密钥在硬件令牌上,无法导出.因此,我必须创建一个证书数据库,在那里添加令牌驱动程序条目并通过此DB工作.只有pesign允许这样做,但它不支持时间戳. osslsigncode和signcode支持时间戳,但是他们无法使用数据库.
Windows signttool.exe可以作为单独的步骤执行签名和时间戳.所以我想,我可能会使用pesign对文件进行签名,然后只使用其他工具对其进行时间戳.但正如我所发现的,osslsigncode和signcode不支持单独的时间戳(在osslsigncode项目中它列在TODO文件中,但在存储库中没有它的迹象).
我错过了一些工具吗?有没有太低级别的库可以让我自己编写这样的程序吗? (首选,C/C++ / Perl / Python.)我试图从osslsigncode获取时间戳代码,但未能轻易地从之前的步骤中删除它(删除现有签名并添加新签名).
附:我也尝试在wine下运行signtool.exe,但1)未能使它工作,2)我不确定它是否合法允许(我不擅长分析EULA).
最佳答案
自2015年3月起,osslsigncode中有一个patch,允许您通过PKCS#11令牌上的密钥签署代码.它还不是官方发布的一部分.所以你必须自己构建它,但它对我来说就像魅力一样.
示例调用如下所示:
osslsigncode sign -pkcs11engine /usr/lib/engines/engine_pkcs11.so -pkcs11module /usr/lib/libeTPkcs11.so -certs ~/mysigningcert.pem -key 0:42ff -in ~/filetosign.exe -out ~/signedfile.exe
-pkcs11module开关将PKCS#11库作为参数,-key的参数采用slotID:keyID格式.