Skip to content

Instantly share code, notes, and snippets.

@frankyueh
Created March 6, 2015 08:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save frankyueh/3d5d45236339ff0097a7 to your computer and use it in GitHub Desktop.
Save frankyueh/3d5d45236339ff0097a7 to your computer and use it in GitHub Desktop.
Code Sign - 程式碼數位簽章
# Code Sign - 程式碼數位簽章
##數位簽章基本架構
1. 產生數位簽章
>`數位簽章 = 簽章( SHA1(程式), 私鑰 )`
2. 簽章過的程式格式
> `簽章的程式 = 程式 + 憑證[公鑰] + 數位簽章`
3. 使用者驗證,程式是否被修改過?
> `SHA1(程式)` 是否等於? `認證( 數位簽章, 憑證[公鑰] )`
4. 使用者驗證,程式的憑證是信任與否?
> 驗證`憑證[公鑰]`的發行者CA是否為信任發行者及有效時間確認
>
> 註:
> 也就是發行者申請憑證的機構,若發行者自行產生,則將不會被信任。
但問題來了,一般申請機構申請的憑證通常只有1~3年那使用者安裝了某個被簽屬的程式,是否在到期後憑證就不合法了?
因此數位簽章通常會有一個簽屬時間戳記簽章(Time Stamping Sign),一旦有時間戳記簽章,使用者就會判斷時間戳記是否在程式簽章憑證時效內只要在時效內,此簽章就永久有效(除非時間戳記簽章的憑證也過期了)
## 加上時間戳記簽章的數位簽章架構
1. 產生數位簽章
`數位簽章 = 簽章( SHA1(程式), 私鑰 )`
2. 產生時間戳記簽章
將**數位簽章**傳送給時間戳記機構(以下簡寫TSS - Time Stamping Service):
> 時間戳記簽章 = 簽章( SHA1(數位簽章 + 時間戳記), TSS私鑰 )
> 時間戳記CA機構將回傳:
> 時間戳記 + TSS憑證[公鑰] + 時間戳記簽章
3. 簽章過的程式格式
> 簽章的程式 = 程式 + 憑證[公鑰] + 數位簽章 + { 時間戳記 + TSS憑證[公鑰] + 時間戳記簽章 }
4. 使用者驗證,驗證簽屬時間戳記是否被修改過?
> `SHA1(數位簽章 + 時間戳記)` 是否等於? `認證( 時間戳記簽章, TSS憑證[公鑰] )`
5. 使用者驗證,驗證簽屬時間戳記的憑證是信任與否?
> 驗證`TSS憑證[公鑰]`的發行者CA是否為信任發行者及有效時間確認
>
> 註:通常時間戳計憑證的有效時間都是10年左右,因此有效時間會較長
6. 使用者驗證,程式是否被修改過?
> `SHA1(程式)` 是否等於? `認證( 數位簽章, 憑證[公鑰] )`
7. 使用者驗證,程式的憑證是信任與否?
> 驗證`憑證[公鑰]`的發行者CA是否為信任發行者及有效時間確認 (由簽屬時間)
>
> 註:也就是發行者申請憑證的機構,若發行者自行產生,則將不會被信任
## 驗證的工具及機構服務
工具有很多種,例如是Visual Studio就有提供的SignTool就可以做程式簽屬
提供的憑證服務機構也有很多,像我們網站使用的Go Daddy,他們也有提供程式簽章的憑證申請。
不過其憑證用途與網站有些不同,要提供的資訊及工作天數也比較多,價錢也比較貴,而這也是選擇信任度較高的憑證機構,會提升發佈程式比較多信任度的主因之一。
另外,時間戳記簽屬的機構,這些憑證網站甚至是工具本身的發行者也會提供。
## 參考資訊
- http://blogs.msdn.com/b/ieinternals/archive/2011/03/22/authenticode-code-signing-for-developers-for-file-downloads-building-smartscreen-application-reputation.aspx
- http://stackoverflow.com/questions/4417410/why-should-we-set-a-timestamp-when-we-do-a-codesigning
- https://casecurity.org/wp-content/uploads/2013/10/CASC-Code-Signing.pdf
- https://support.comodo.com/index.php?/Knowledgebase/Article/View/68/0/time-stamping-server
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment