利用已过期的的代码签名证书进行签名.

代码签名证书和网站SSL证书其实区别不大,主要是作用区别.一个是作用于网站,一个作用于代码.

 

有效的数字证书有个两个共同特点就是

1,拥有有效期

2,由权威可信机构颁发.

 

复制证书

复制证书是很多年前经常用的一个方法.将有效证书签发的文件复制里面证书字节,然后粘贴到想要复制的文件上,改下入口就好了.

因为这是一个机械,有规律的行为,很容易做成一个软件,网上有现成的工具.

 

那时候因为360娱乐软件对自己证书有绝对的白名单,你什么妖魔鬼怪的代码,用山寨的360证书一签名,360放行了.

 

现在我们来说下用过期的证书签名.

 

 

有效证书签名

过下过期证书如何签名之前,先说下有效的证书签名有什么.

这是我几年前用一个有效证书签发的程序,当时证书还在有效期.

 

如今证书已经过了有效期,但是依然显示有效.

是因为有个非常重要的东西,时间戳

 

 

时间戳

时间戳也是由权威机构提供,签发.

它的存在就好像你发,票上的税务局印花一样.用于证明代码签名证书有效时间内签名.

 

如果代码签名没有时间戳会如何?

答案是:

1,如果证书是权威机构颁发,且证书在有效期,那么证书算有效. (你在商城买了一个电饭煲,给你开了一个保修卡,一年保修,有效期内保修卡有效.)

2,如果证书是权威机构颁发,证书已过期,那么证书算无效.  (你电饭煲过了一年保修期,商城不再提供保修)

3,如果证书是自己签发的,那么无论如何证书都无效. (你拿个你别处买的电饭煲,拿个自己手写保修卡,拿到商城去保修,商城不认)

 

 

伪造签名

修改时间

证书一旦过了有效期,将不能给文件签名了.

但计算机的时间不像现实时间是不可修改和逆转的.

 

我们将电脑时间修改为证书有效期内.

我们就能继续用证书给文件签名.

 

但是有个问题就是,我们无法打上时间戳,因为,时间戳服务器会校验你签名时间和它服务器时间.

如果我们将系统时间纠正. 代码证书过期,就等于签名无效.

 

但是如果我们考虑伪造时间戳呢?

 

伪造时间戳

 

这是我一直以来想要实现的,前段时间在GitHub上找到一个开源项目,也是国人开发.

用于伪造时间戳-->链接

releases 里面有编译好的程序,需要.net4.0  (win 7以后的系统一般直接运行)

 

解压后,用管理员权限运行demo.exe 按回车启动程序.确保80端口不被占用,确保TSA.crt和TSA.key在相同目录.

如下提示

HTTP Server and TimeStamp Responder started successfully!
TSResponder is available at "http://localhost/TSA/" or "http://localhost/TSA/yyyy-MM-ddTHH:mm:ss"

时间戳地址可以有两种

第一种就是按当时间,第二个就是指定特定时间

 

签名用微软提供的signtool签名工具-->链接

signtool sign /v  /f JJJ123.p12 /p JJJ123 /tr http://localhost/TSA/2014-08-08T08:08:08  QzoneX3.exe

时间和日期中间有个大写T.

JJJ123.P12  是我的证书文件, JJJ123是密码

最后面是待签名的文件

 

 

伪造时间戳虽然能让过期的证书继续签名,但是依然提示无效.

 

如果需要使得有效.那么需要导入时间戳证书导入到系统信任CA区.

 

这样就是有效了.

 

导入方式有两种,手动导入.把TSA.csr导入信任CA即可.

另外就是注册表导入

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\ROOT\Certificates\

源代码里面提供的注册表导入文件.

 

 

补充

虽然导入时间戳证书能让证书有效.

但是不是任何电脑都会这样做.你把文件复制到其他电脑,就会提示无效.

 

要想真正解决此问题,只能找一个可信的时间戳证书.用来架设时间戳签名站.

这显然不太可能.

 

不过,应该可以弄过过期的时间戳证书.先修改系统时间,让时间戳证书有效,然后一切问题都能迎刃而解.

 

后期我找找.