SERVICE / 02 — CODE SIGNING

軟體安全簽章.

程式碼簽章憑證申請與簽署流程建置導入/教學,讓軟體通過系統安全驗證、順利安裝與更新。

Code SigningWindows SmartScreenmacOS Notarization
程式碼簽章與公證流程插圖
SCOPE

涵蓋範圍

Windows Code Signing

OV standard 與 EV code sign 都支援,現在建議用 EV code sign(微軟推薦)。憑證商建議使用 DigiCert。

macOS Notarization

完整流程:Sign → Notarize → Staple → Verify。

01以 Developer ID Application 身分簽章,帶 hardened runtime 與安全時間戳。
02notarytool 送 Apple 公證。
03stapler 將公證票釘進 app,離線環境也能通過 Gatekeeper。
04出貨前自動驗證:codesign 深度驗證、Authority 與 Team ID 斷言、spctl 模擬 Gatekeeper 放行、stapler 驗票——且不只驗 .app,會把最終 DMG 掛載起來對裡面那份 app 再驗一次,確保使用者實際安裝的檔案已簽、已公證、已釘票。
建置導入/教學

兩種都提供:可代為把 CI 簽署流程建好(一次性交付),也可教學讓團隊自行維護。

CASE NOTE

一個真實細節

在 CI runner non-interactive shell 中 codesign 找不到私鑰。

Automating non-interactive shell code signing on a self-hosted macOS runner

現象CI 工具已把 Developer ID 憑證匯入臨時 keychain,但在 runner 上 find-identity 找不到 identity、codesign 失敗——「憑證明明匯入了,卻找不到」。
根因codesign/find-identity 是照當前 security session 的 keychain search list 解析 identity;那個臨時 keychain 不在 runner 非互動(daemon)session 的搜尋清單裡。精確地說:the signing keychain wasn't in the keychain search list of the runner's non-interactive (daemon) security session.
過程先後試過三種繞法:把簽章 keychain 同時加進 user 與 dynamic(per-session)兩個 search-list domain;寫 codesign 包裝腳本強制 --keychain 直接指定、不靠搜尋清單;identity 改用 SHA-1 hash 選取,避免多個 keychain 同名的解析歧義。
解法不與「臨時 keychain+session 搜尋範圍」纏鬥:runner 改跑在 GUI 登入 session、直接從 login keychain 簽章(本來就在互動 session 的搜尋清單裡),執行開頭 unlock-keychain、identity 以 hash 指定;搜尋範圍的 hack 與包裝腳本隨之全部移除。
加碼另做了一支診斷工具,可比對 .p12 匯入與 login keychain 兩種簽章來源,並檢查 identity 字串是否被前後空白、CR/LF、NBSP 等看不見的字元汙染——很多人卡住查不到原因的地雷。
FAQ

常見問題

憑證一年多少錢?誰持有?能幫忙申請+簽核嗎?
WindowsEV code sign 建議使用主流代理商與 DigiCert 頂級代理商,EV code sign 本身約落在 NTD 20,000–35,000/年。可以協助申請與簽核。
macOSApple Developer Program 一年 99 USD。
不是你們開發的軟體也能簽嗎?

還是建議用自身公司名義申請的喔!

CONTACT

Let's talk.

簽章、上架或 CI 導入的需求,請透過以下表單與我們聯絡。

必填
必填
選填
必填