如何将时间戳证书添加到Linux上已签名的PE文件?

时间:2015-01-20 23:35:54

标签: linux code-signing portable-executable trusted-timestamp

我需要在Linux上对PE文件(实际上是EFI)进行数字签名和时间戳。我找到了3个用于签署PE文件的工具:pesignosslsigncodesigncode(单声道),但它似乎完全不符合我的需求。问题是,密钥在硬件令牌上,无法导出。因此,我必须创建一个证书数据库,在那里添加令牌驱动程序条目并通过此DB工作。只有pesign允许这样做,但它不支持时间戳。 osslsigncodesigncode支持时间戳,但他们无法使用数据库。

Windows signttool.exe可以作为单独的步骤执行签名和时间戳。所以我想,我可能会使用pesign对文件进行签名,然后只使用其他工具对其进行时间戳记。但是正如我发现的那样,osslsigncodesigncode不支持单独的时间戳(在osslsigncode项目中它列在TODO文件中,但在存储库中没有它的迹象)。

我错过了一些工具吗?有没有太低级别的库可以让我自己编写这样的程序吗? (首选,C / C ++ / Perl / Python。)我试图从osslsigncode获取时间戳代码,但未能轻易地从之前的步骤中删除它(删除现有签名并添加新签名)。

P.S。我还尝试在葡萄酒下运行signtool.exe,但1)未能使其正常工作,2)我不确定它是否合法允许(我不擅长分析EULA)。

3 个答案:

答案 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简单地发送到服务器,然后响应就是签名文件。

https://www.signserver.org/

答案 2 :(得分:0)

当前 osslsigncode 具有时间戳选项 -t

osslsigncode sign \
  -pkcs12 cert.pfx -pass "**********" \
  -t http://timestamp.digicert.com \
  -in app.exe  -out app-sign-with-timestamp.exe

https://github.com/mtrojnar/osslsigncode