JemmyLoveJenny Local TimeStamp Responder是一款本地时间戳应答器(可以倒填时间制造有效签名),这个项目是一个带有演示的时间戳响应程序库。您可以使用我的项目生成过期的TimestampResponse作为联合签名,以验证过期/吊销的代码签名。
软件说明
您必须生成自己的TSA证书及其私钥,并将该证书导入到您的信任存储中。对于cert-key对有一些要求,在tsacertificates文件夹中进行了解释。
库同时支持Microsoft验证码时间戳和RFC3161时间戳。演示只是一个本地响应程序,因此它不能是可靠的时间戳服务器。
软件功能
主要作用就是让系统认为某个程序是在证书过期/吊销之前被签名的,通过系统的签名验证。
使用说明
原本没想要发布这个单独的时间戳程序,但是有很多人问有关时间戳的问题,因此就把原来Java写的代码翻译到CSharp,做了一个时间戳签名库和它的Demo。
代码已开源,在 https://github.com/JemmyLoveJenny/TimeStampResponder-CSharp
自建时间戳服务器只需要一张自签名的时间戳证书和对应的私钥和证书链。
时间戳证书必须是X509v3证书,包含标记critical的ExtendedKeyUsage属性,ExtKU只允许证书用于时间戳签名。
证书文件如果不是自签名的,则还需要包含证书链。子证书在最上面,CA证书在最下面,就像部署SSL证书链那样操作。
私钥文件必须使用PKCS1编码保存,PKCS8无法识别。
Github和Release中都有从我PKI中签发出的时间戳证书,可以作为一个证书的样板。
虽然我的证书默认不受信,但是我还是不希望你们滥用它。
本地时间戳服务器的地址是 http://localhost/TSA/ 注意!这个Demo真的只是一个本地的服务,不能作为广泛使用的时间戳服务器。
因为我设置了只能从localhost访问,局域网内其他电脑访问不到这个时间戳服务。甚至用127.0.0.1或者::1都不可以!
Demo可以和IIS共用80端口,如果有Apache或者Nginx这类服务器绑定了80端口,那么Demo就无法正常启动,表现为要求以管理员身份运行。
程序使用HttpListener组件实现简单的HTTP服务,因此必须要求以管理员身份运行
程序成功运行后,这个地址支持 Authenticode 和 RFC3161 时间戳,也就是说,在微软signtool中使用 /t "<URL>" 或者 /tr "<URL>" 都是可以的,可以根据自己的需要打不同协议的时间戳 (Authenticode时间戳兼容性比较好,支持XP)
自定义时间的话,就是在地址后面加上希望的时间(UTC时间,需要转换时区)。
格式为"yyyy-MM-dd'T'HH:mm:ss"
北京时间是UTC+8,所以地址后面的时间需要减掉8小时才能变成UTC时间。
举几个例子:
北京时间 2011-04-01 08:00:00,对应的时间戳地址是 http://localhost/TSA/2011-04-01T00:00:00
北京时间 2019-03-10 10:25:34,对应的时间戳地址是 http://localhost/TSA/2019-03-10T02:25:34
然后打时间戳就用微软的signtool,命令为 【signtool timestamp /t "<URL>" <filename>】
如果是双签名,另加/tp参数指定签名序号,打两次时间戳【signtool timestamp /tp <index> /tr "<URL>" <filename>】
比如说,给我要给 test.exe 单签名打2011-04-01 08:00:00的时间戳,完整命令为 【signtool timestamp /t "http://localhost/TSA/2011-04-01T00:00:00" test.exe】
如果 test.exe 有双签名,首先执行上一条命令,然后再用【signtool timestamp /tp 1 /tr "http://localhost/TSA/2011-04-01T00:00:00" test.exe】给第二个签名打时间戳
注意!自定义的时间戳日期最好接近证书的颁发时间,因为大部分泄露的证书已经被CA吊销,自定义的时间必须在证书吊销之前才能通过驱动签名验证!