[Code Signing] 利用自然人憑證進行程式碼簽章

前面兩篇淺談了 Code SigningEV Code Signing,但無論何者基本上都需要以公司的名義才可申請、購買。那若單純想要以個人的名義發行軟體就顯得相當麻煩。但事實上,中華民國18歲以上的公民,都可以申請一張自然人憑證,而內政部所發給的憑證是受 Windows 認可的,也就是說這張憑證也可作為簽章依據!以下就來詳細介紹如何利用自然人憑證完成這個簽署動作。

1. 將自然人憑證註冊至電腦

可至內政部憑證管理中心下載 HiCOS 卡片管理工具,並依據下列步驟將憑證註冊至電腦。
註冊成功會出現以下畫面:

若要瀏覽或刪除電腦中曾經註冊的憑證,可參考「如何刪除安裝在電腦中的管理憑證」。

2. 進行程式碼簽章作業

先利用 Visual Studio 的介面簡單的介紹一下現在的簽章環境。為什麼說是「先」呢,因為無論 Visual Studio 2015 或 2017,我都無法在上頭成功完成自然人憑證簽署的作業。須仰賴其他方式。

在 Visual Studio 的專案屬性中,可以看到以下畫面:

  • Select from Store...
    也就是使用上述電腦中已註冊的憑證進行簽章作業,自然人憑證就是選用這項。
  • Select from File...
    藉由「憑證檔(*.pfx)」進行簽署作業。某些憑證不像自然人憑證具有實體卡片而是以一個 pfx 檔代替,例如金融憑證或是向各大廠商購買的 Code Signing。
  • Create Test Certificate...
    產生一個測試用的憑證。這個憑證相當於你自己發行的,當然不被 Windows 給認可,純粹測試用。
  • Timestamp server URL
    這就是在上一篇提過的時間戳記啦~。
具官方說法,自然人憑證是無法轉為 pfx 檔的,所有作業得仰賴實體的晶片卡。

OK,簡單介紹就到這邊。理論上將「Sign the ClickOnce manifests」給勾選,在程式編譯時,應該會自動幫我把設定好的憑證給簽署上檔案。但...當選擇對象為自然人憑證後,他只吐出了一句「internal error」...。

經過一番搜尋,發現直接使用 SignTool 可以完成簽署的作業!SignTool 的詳細使用方式可以參考官方文件。這邊就很簡單的分享我使用的指令,方便大家即摳即用。XD

首先,當然是先找到 SignTool.exe 的所在位置,我的是在 C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool 。接著就是用 command line (命令提示字元)進行以下操作。

必須再次提醒的是時間戳記的部份,上一篇提過,若是沒有時間戳記的簽章,是真的會「過期」的。要蓋上時間戳記,必須先找到一個 Time Stamping Server,這邊分享一個我找到的:http://timestamp.comodoca.com

在我的環境下,是直接讓 Code Sign 自動選取「最佳」(/a)的憑證即可使用自然人憑證進行簽章:signtool.exe sign /a /tr http://timestamp.comodoca.com "xxx.exe"。此時會跳出一個要求輸入憑證密碼的視窗,輸入後隨即出現成功訊息,完成簽署。

Successfully signed: xxx.exe

就這樣!大功告成!!

很明顯的,用自然人憑證簽署,最大的問題是你的名字會赤裸裸的一併被蓋上去呢~!
我猜想金融憑證也可以用類似的方式作為程式碼簽章,無奈手邊的金融憑證已經過期太久,無法線上展期後實驗,若有人實驗過請告訴我~謝謝~~。