我想用我自己的 Authenticode 时间戳服务给我的 DLL 文件加上时间戳。这可能吗?我怎么能做到这一点?
5 回答
您可以开发自己的时间戳服务。您可以编写 TSP (RFC 3161) 服务器,但 Authenticode 不使用 RFC 3161,而是使用MSDN 文章中描述的 PKCS#7/PKCS#9 格式(您也可以实现)。我们的SecureBlackbox组件包括支持这两种格式的时间戳服务器组件。更新:最近对 Authenticode 的更新使用标准 RFC 3161 时间戳。
但问题是要获得用于签署时间戳的证书。该证书必须由其中一个 CA 颁发,据我了解,对于运行时间戳服务器的管理和基础架构方面存在严格的要求。特别是您需要有一个安全的时间戳硬件。我没有深入研究这个问题,但是这些方面比编写一段代码要复杂得多。
尽管如此,如果您运行自己的 PKI 基础设施(拥有自己的可信根证书和 CA 证书),那么拥有可信时间戳证书的问题就会自动解决——您可以生成自己的证书。
您需要编写一个自定义 HTTP 时间戳服务器。它应该遵循RFC 3161时间戳协议 (TSP) 规则。
当您使用Windows SDK 中的Signtool.exe等工具对 DLL 进行身份验证时,您可以指定时间戳服务器的 url(使用 /t 开关。另请参见 /tr 和 /td)。然后,您将指向您的服务器。
有关相关问题,请参见此处的 SO:Trusted Timestamps - Understanding the format (rfc3161)
您可以使用 SignServer 设置您自己的支持 Authenticode 时间戳(和/或 RFC#3161)的时间戳授权 (TSA)。
有关下载和安装说明,请参见https://www.signserver.org。总之,重要的步骤是:
确保您具有先决条件:
- 爪哇
- 应用服务器(即 WildFly)
- 用于部署的 Apache Ant
从https://signserver.org或https://sourceforge.net/projects/signserver/files/signserver/4.0/下载 4.0 版本。
配置应用服务器
- 对于 HTTPS(可选)
- 使 Web 服务正常工作
- 使用最新的安全修复补丁
配置 SignServer 部署
- 在 conf/signserver_deploy.properties 中设置 database.name=nodb 和 database.nodb.location=/an/empty/folder/as/db
部署 SignServer
- 导出 APPSRV_HOME=/opt/wildfly-9/
- bin/ant 部署
- 启动应用服务器 /opt/wildfly-9/bin/standalone.sh
检查服务器是否已启动
- bin/signserver getstatus 简介
设置加密令牌
- bin/signserver setproperties doc/sample-configs/keystore-crypto-configuration.properties
- bin/signserver 重新加载 1
- bin/signserver getstatus 简介
设置示例时间戳签名者
- bin/signserver setproperties doc/sample-configs/qs_timestamp_configuration.properties
- bin/signserver 重新加载 2
- bin/signserver getstatus 简介
测试时间戳签名者
- bin/signclient 时间戳http://localhost:8080/signserver/process?workerName=TimeStampSigner
假设您希望将其用于测试,如果您乐于使用带有 /tr 开关的 signtool.exe,则不必查看 RFC,因为 openssl 为您实现了足够多的功能。只需用您喜欢的语言编写一个 HTTP POST 处理程序,将发布的数据逐字传递到“openssl ts -reply”中,然后发回 openssl TS 响应数据。这足以欺骗“signtool.exe verify /pa”,即使它没有严格遵循 RFC。
编辑:似乎开源 Java Signserver 项目为您提供了一个处理 MSauthenticode (/t) 和 rfc3161 (/tr) 时间戳的服务器。对我来说,Signserver 的配置涉及太多依赖项,因此我改用了它的 MSAuthenticode 时间戳单元测试,将一个小型 HTTP 服务器固定在测试用例上,并且几乎没有工作 - 我的 Java 技能充其量是平庸的 - 有一个正在运行的验证码时间戳服务器供开发使用,并已验证由此创建的时间戳不受此问题的影响。我不能发布源代码,但是按照这个技巧应该可以让你很快地工作。
https://PKIaaS.io提供符合 RFC 3161 和 Microsoft Authenticode 的时间戳服务器。在站点上创建证书颁发机构后,它将在“CA 服务 URL”列表中显示一个时间戳 URL,时间戳请求可以发送到该 URL 以进行签名。