我需要在Linux上对PE文件(实际上是EFI)进行数字签名和时间戳。我找到了3个用于签署PE文件的工具:pesign
,osslsigncode
和signcode
(单声道),但它似乎完全不符合我的需求。问题是,密钥在硬件令牌上,无法导出。因此,我必须创建一个证书数据库,在那里添加令牌驱动程序条目并通过此DB工作。只有pesign
允许这样做,但它不支持时间戳。 osslsigncode
和signcode
支持时间戳,但他们无法使用数据库。
Windows signttool.exe
可以作为单独的步骤执行签名和时间戳。所以我想,我可能会使用pesign
对文件进行签名,然后只使用其他工具对其进行时间戳记。但是正如我发现的那样,osslsigncode
和signcode
不支持单独的时间戳(在osslsigncode
项目中它列在TODO
文件中,但在存储库中没有它的迹象)。
我错过了一些工具吗?有没有太低级别的库可以让我自己编写这样的程序吗? (首选,C / C ++ / Perl / Python。)我试图从osslsigncode
获取时间戳代码,但未能轻易地从之前的步骤中删除它(删除现有签名并添加新签名)。
P.S。我还尝试在葡萄酒下运行signtool.exe
,但1)未能使其正常工作,2)我不确定它是否合法允许(我不擅长分析EULA)。
答案 0 :(得分:3)
自2015年3月起, osslsigncode 中有一个patch,允许您通过PKCS#11令牌上的密钥对代码进行签名。它还不是官方发布的一部分。所以你必须自己构建它,但它对我来说就像魅力一样。
示例调用如下所示:
-pkcs11module
-key
开关将PKCS#11库作为参数,slotID:keyID
的参数采用context.Response.ContentLength64 = response.Length;
context.Response.ContentType = "application/x-font-woff";
context.Response.OutputStream.Write(response, 0, response.Length);
context.Response.OutputStream.Close();
格式。
答案 1 :(得分:1)
SignServer Enterprise Edition支持使用Authenticode对PE文件进行签名和时间戳。
此外,PKCS#11接口还支持硬件令牌。
SignServer通常设置在单独的服务器或VM上,最好在Linux上运行(但也支持Windows)。
您要签名的文件可以通过HTTP POST简单地发送到服务器,然后响应就是签名文件。
答案 2 :(得分:0)
当前 osslsigncode
具有时间戳选项 -t
:
osslsigncode sign \
-pkcs12 cert.pfx -pass "**********" \
-t http://timestamp.digicert.com \
-in app.exe -out app-sign-with-timestamp.exe