[Code Signing] 淺談 Code Signing 程式碼簽章

前一陣子研究過幾次程式碼簽章(Code Signing)及延伸驗證程式碼簽章(EV Code Signing),覺得資訊真的非常混亂複雜。特別用一篇網誌記錄一下我學習到的內容,也提供給有興趣的各位參考,若有任何錯誤,拜託糾正我,別讓我繼續散佈錯誤資訊,感謝!!

這篇先介紹基礎的程式碼簽章,延伸驗證程式碼簽章是差不多的東西,下一篇再補充。

這篇僅介紹 Microsoft Windows desktop app 的情境。
以下數位簽章、簽章、程式碼簽章為同義詞。

所謂的程式碼簽章,就是一個虛擬的印章,在編譯好的軟體(.dll、.exe、...)上蓋章。軟體一旦被重新編譯、竄改,所蓋的章也就會消失。就只是這樣,所以簽章並不具有保證軟體無毒無害等功能。

那為什麼需要蓋章呢?

有以下幾個原因:

  1. 使用者在軟體上有看到數位簽章,表示這個軟體沒有被別人竄改過,是從簽章擁有人那邊出品的。
  2. 若執行具有簽章的軟體時,Windows 便不會跳出警告嚇唬使用者!...但簽章後依然會跳出提示視窗...(如下圖)。不過使用者可以透過 UAC 設定關掉這些視窗(預設是開啟)。

如何檢視軟體上的簽章?

以 Windows10 來說,在檔案上點擊右鍵 -> 內容,若有看到「數位簽章」的分頁表示該軟體具有簽章。而進一步點擊「詳細資料」 -> 「檢視憑證」,可以看到更詳細的簽章資訊。

如何取得簽章?

若只是要確認軟體沒有被竄改,使用一般自製的簽章即可,產生也非常容易(下篇會介紹);但若要避免 Windows 跳出警告,就沒那麼容易了,想當然爾,你的簽章必須要是 Windows 認可的章。

這個簽章必須要向微軟認可的發行商購買,且具有使用期限的限制。官方說法是避免被暴力破解,也就是時間一久,簽章可能被偽造。想像一下你有一顆獨特的印章,此印章只能被複製,但沒有辦法被修改。而被有心人士複製的時間需要七天。若將印章都加上一個小於七天的使用期限,且每七天就換一顆印章使用,如此一來便不用太擔心印章被偽造,即使被複製出來,因為連同使用期限都一併複製了,所以也以無法使用。

目前市面上常見的簽章發行商大概有:GlobalTrust、Thawte、GeoTrust、GlobalSign、Symantic 等。在台灣都有代理商,但也可以直接向國外購買。跟代理商購買的好處是有中文技術支援、簽章的工具(USB TOKEN)寄送比較快、可以開立發票,壞處當然就是價格比較高啦。

而購買的流程當然不像是網購這麼簡單,如果這麼簡單就失去「認證」這件事的意義了。就我所知,無法以個人名義購買,他得先確認這是一間正派經營真正存在的公司,才能將簽章販售給您。

以下簡單分享一下透過台灣代理商購買 GlobalSign 程式碼簽章的經驗。透過台灣代理商進行申請後,會由 GlobalSign 官方進行進一步的電話照會,當然不會依據你申請書上填寫的電話聯繫,否則也太容易作假了。他會依據公司公開資訊上頭的資訊進行聯繫,所以若是大型企業,必須得和總機先溝通好,請他轉到你的分機。更妙的是照會過程可能會請你將話筒交給隔壁的同事,確認...好,其實我也不知道這樣可以確認什麼 XD。

照會是用中文,不用太擔心鴨子聽雷的狀況。

憑證路徑可以檢視簽章授權單位。

簽章可以一蓋再蓋或覆寫嗎?

可!都可!已經有簽章的檔案上,可以再附加簽章,也可以覆寫掉。但若單純要移除簽章,據說是比較困難的

因為可以覆寫,所以具有某 A 簽章的軟體,不見得就是他自行產生的,只能說明簽章是他蓋的(在沒有被盜用的前提下)。

關於時間戳記

在簽章效期內進行蓋章動作時,可以選擇是否要加上時間戳記。想當然爾,當然不會是依據本機時間附加戳記,需要連結 Time Stamping Server 才能附加戳記。一旦正確蓋印上去後,這個檔案的簽署永久有效。不會因為時間超過簽章的有效期而變為無效簽章

若不附加時間戳記會怎樣?根據上列的兩個目的來看:

  1. 沒有附加時間戳,此簽章蓋印的時間無法確定,可能早就被破解了?便也無法確認軟體是不是重新被編譯過,就不具意義了。
  2. Windows 對於沒有時間戳的簽章,會以簽章到期日作為依據。若本機時間在到期日之前,會視為有效簽章,過期便會視為無效簽章。

所以雖然可以自由決定要不要附上時間戳,但依據上述兩個目的來說,顯然是必須的。

有沒有簽章很重要嗎?

我覺得這相當見仁見智,因為多數人在執行軟體時,好像不會理會那一個「發行者不明」的警告訊息...。但若擔心程式被竄改後發布,那就是另一回事了,此時簽章的意義就顯得比較重要了。

 

至於什麼是延伸驗證程式碼簽章(EV Code Signing)?實際如何進行簽章動作?個人也想要進行簽章該怎麼辦?下篇待續...