JemmyLoveJenny Local TimeStamp Responder是一款本地時(shí)間戳應(yīng)答器(可以倒填時(shí)間制造有效簽名),這個(gè)項(xiàng)目是一個(gè)帶有演示的時(shí)間戳響應(yīng)程序庫(kù)。您可以使用我的項(xiàng)目生成過期的TimestampResponse作為聯(lián)合簽名,以驗(yàn)證過期/吊銷的代碼簽名。
軟件說明
您必須生成自己的TSA證書及其私鑰,并將該證書導(dǎo)入到您的信任存儲(chǔ)中。對(duì)于cert-key對(duì)有一些要求,在tsacertificates文件夾中進(jìn)行了解釋。
庫(kù)同時(shí)支持Microsoft驗(yàn)證碼時(shí)間戳和RFC3161時(shí)間戳。演示只是一個(gè)本地響應(yīng)程序,因此它不能是可靠的時(shí)間戳服務(wù)器。
軟件功能
主要作用就是讓系統(tǒng)認(rèn)為某個(gè)程序是在證書過期/吊銷之前被簽名的,通過系統(tǒng)的簽名驗(yàn)證。
使用說明
原本沒想要發(fā)布這個(gè)單獨(dú)的時(shí)間戳程序,但是有很多人問有關(guān)時(shí)間戳的問題,因此就把原來Java寫的代碼翻譯到CSharp,做了一個(gè)時(shí)間戳簽名庫(kù)和它的Demo。
代碼已開源,在 https://github.com/JemmyLoveJenny/TimeStampResponder-CSharp
自建時(shí)間戳服務(wù)器只需要一張自簽名的時(shí)間戳證書和對(duì)應(yīng)的私鑰和證書鏈。
時(shí)間戳證書必須是X509v3證書,包含標(biāo)記critical的ExtendedKeyUsage屬性,ExtKU只允許證書用于時(shí)間戳簽名。
證書文件如果不是自簽名的,則還需要包含證書鏈。子證書在最上面,CA證書在最下面,就像部署SSL證書鏈那樣操作。
私鑰文件必須使用PKCS1編碼保存,PKCS8無法識(shí)別。
Github和Release中都有從我PKI中簽發(fā)出的時(shí)間戳證書,可以作為一個(gè)證書的樣板。
雖然我的證書默認(rèn)不受信,但是我還是不希望你們?yōu)E用它。
本地時(shí)間戳服務(wù)器的地址是 http://localhost/TSA/ 注意!這個(gè)Demo真的只是一個(gè)本地的服務(wù),不能作為廣泛使用的時(shí)間戳服務(wù)器。
因?yàn)槲以O(shè)置了只能從localhost訪問,局域網(wǎng)內(nèi)其他電腦訪問不到這個(gè)時(shí)間戳服務(wù)。甚至用127.0.0.1或者::1都不可以!
Demo可以和IIS共用80端口,如果有Apache或者Nginx這類服務(wù)器綁定了80端口,那么Demo就無法正常啟動(dòng),表現(xiàn)為要求以管理員身份運(yùn)行。
程序使用HttpListener組件實(shí)現(xiàn)簡(jiǎn)單的HTTP服務(wù),因此必須要求以管理員身份運(yùn)行
程序成功運(yùn)行后,這個(gè)地址支持 Authenticode 和 RFC3161 時(shí)間戳,也就是說,在微軟signtool中使用 /t "<URL>" 或者 /tr "<URL>" 都是可以的,可以根據(jù)自己的需要打不同協(xié)議的時(shí)間戳 (Authenticode時(shí)間戳兼容性比較好,支持XP)
自定義時(shí)間的話,就是在地址后面加上希望的時(shí)間(UTC時(shí)間,需要轉(zhuǎn)換時(shí)區(qū))。
格式為"yyyy-MM-dd'T'HH:mm:ss"
北京時(shí)間是UTC+8,所以地址后面的時(shí)間需要減掉8小時(shí)才能變成UTC時(shí)間。
舉幾個(gè)例子:
北京時(shí)間 2011-04-01 08:00:00,對(duì)應(yīng)的時(shí)間戳地址是 http://localhost/TSA/2011-04-01T00:00:00
北京時(shí)間 2019-03-10 10:25:34,對(duì)應(yīng)的時(shí)間戳地址是 http://localhost/TSA/2019-03-10T02:25:34
然后打時(shí)間戳就用微軟的signtool,命令為 【signtool timestamp /t "<URL>" <filename>】
如果是雙簽名,另加/tp參數(shù)指定簽名序號(hào),打兩次時(shí)間戳【signtool timestamp /tp <index> /tr "<URL>" <filename>】
比如說,給我要給 test.exe 單簽名打2011-04-01 08:00:00的時(shí)間戳,完整命令為 【signtool timestamp /t "http://localhost/TSA/2011-04-01T00:00:00" test.exe】
如果 test.exe 有雙簽名,首先執(zhí)行上一條命令,然后再用【signtool timestamp /tp 1 /tr "http://localhost/TSA/2011-04-01T00:00:00" test.exe】給第二個(gè)簽名打時(shí)間戳
注意!自定義的時(shí)間戳日期最好接近證書的頒發(fā)時(shí)間,因?yàn)榇蟛糠中孤兜淖C書已經(jīng)被CA吊銷,自定義的時(shí)間必須在證書吊銷之前才能通過驅(qū)動(dòng)簽名驗(yàn)證!