參考資料
本頁面整理 sslTrus 遠端程式碼簽章服務在不同整合方式中共用的參考資訊,包括:
- 程式碼簽章次數計算規則。
- Authenticode 和 RFC 3161 時間戳記通訊協定。
- 常用程式碼簽章時間戳記伺服器。
- 正式環境選擇時間戳記服務時需要關注的事項。
簽章次數計算
簽章次數依實際完成的簽章動作計算。
簡單理解:
一个文件成功完成一次签名 = 一次签名次数
簽名次數不是按照原始程式碼檔案數量計算,也不是按照一次建置、一次打包或一次 CI/CD Pipeline 計算。
例如:
100 个源代码文件
↓
编译生成 1 个 app.exe
↓
app.exe 成功签名一次
↓
1 次签名
如果一次建置產生:
app.exe
helper.dll
installer.msi
並且三個檔案都分別完成簽署,則:
签名次数 = 3 次
基本規則
簽名次數主要看:
- 最終有哪些檔案或物件被簽名。
- 每個物件實際完成了多少次簽名。
- 使用的是普通用戶端簽名,還是 KSP、Jarsigner 等底層簽名呼叫方式。
- 建置工具是否自動簽名了額外的 EXE、DLL、解除安裝程式或安裝套件。
常見簽名物件包括:
.exe.dll.msi.msp.sys.cat.jar- 解除安裝程式,例如
uninstall.exe
只要某個物件實際成功完成一次簽名,就按照對應的計次規則計算。
成功才計次
只有遠端程式碼簽名服務成功完成簽名,才產生簽名次數。
以下情況通常不計次:
- 鑑權失敗。
- 參數錯誤。
- 憑證不可用。
- 網路請求失敗。
- 服務端沒有成功返回簽名結果。
- 查詢憑證。
- 查詢簽名記錄。
- 驗證簽名。
- 移除既有簽名。
- 產生驗證檔案。
如果遠端服務已經成功返回簽名結果,但用戶端隨後在本機寫入檔案、新增時間戳或執行後續處理時失敗,則已經完成的遠端簽名仍然按照成功簽名計算。
時間戳不單獨計次
時間戳用於證明簽名在特定時間已經存在,不屬於新的程式碼簽名操作。
因此:
程式碼簽署 → 產生簽署次數
加入時間戳記 → 不額外產生簽署次數
驗證簽署 → 不產生簽署次數
時間戳記服務是否成功,只影響最終簽章檔案的時間戳記結果,不代表額外執行了一次程式碼簽章。
SignTool CLI
使用 sslTrus SignTool CLI:
signtool sign \
--cert-code CERT_CODE \
--file app.exe
如果簽名成功:
1 个文件 × 1 次成功签名 = 1 次
例如:
signtool sign --cert-code CERT_CODE --file app.exe
signtool sign --cert-code CERT_CODE --file helper.dll
signtool sign --cert-code CERT_CODE --file installer.msi
三個檔案全部成功:
合计 = 3 次
SignTool CLI 雙簽
如果使用普通 SignTool CLI 同時啟用 SHA-1 和 SHA-2:
signtool sign \
--cert-code CERT_CODE \
--file app.exe \
--sha1=true \
--sha2=true
一般 CLI 雙簽按照一個用戶端簽章任務計算:
GUI / SignTool CLI 双签 = 1 次
這是普通用戶端簽署流程與 KSP 底層簽署呼叫最容易混淆的地方。
Windows KSP
KSP 是 Windows CNG Provider 整合方式。
Microsoft SignTool、MSBuild、Visual Studio、Electron 打包工具或其他 Windows 軟體透過 KSP 呼叫遠端程式碼簽署時,計次更接近:
底层远程私钥签名调用次数
例如:
| 操作 | 簽章次數 |
|---|---|
對 app.exe 執行一次 SHA256 簽章 | 1 次 |
| 先執行 SHA256,再附加 SHA1 | 2 次 |
分別簽章 app.exe、helper.dll、uninstall.exe | 3 次 |
因此:
SignTool CLI 双签 = 1 次
KSP 双签 = 2 次
如果工具對同一個檔案執行多次底層簽章操作,每次成功的遠端簽章都會分別計算。
CSP
CSP 是傳統 Windows CryptoAPI Provider。
CSP 同樣由 Microsoft SignTool 或其他 Windows 應用程式透過 Provider 呼叫遠端簽章服務。
判斷簽章次數時,應以實際發生的遠端私密金鑰簽章操作為準。
如果工具分別對多個檔案或對同一個檔案執行多次簽章,應分別計算。
Jarsigner
使用 sslTrusJarsigner Provider 時,標準 jarsigner 會在簽章過程中呼叫遠端程式碼簽章服務。
通常:
| 操作 | 簽章次數 |
|---|---|
對 app.jar 簽章 | 1 次 |
| 對 3 個 JAR 分別簽章 | 3 次 |
| 對同一個 JAR 再執行一次簽章 | 再增加 1 次 |
jarsigner -verify | 0 次 |
| 產生驗證用 keystore | 0 次 |
因此:
每个 JAR 每次成功完成签名 = 1 次
安裝套件
安裝套件需要區分:
- 安裝套件內部的可執行檔案。
- 安裝套件本身。
例如:
app.exe → 簽署 1 次
installer.msi → 簽署 1 次
則:
合计 = 2 次
如果還有其他檔案:
| 檔案 | 是否簽章 | 簽章次數 |
|---|---|---|
app.exe | 是 | 1 |
helper.dll | 是 | 1 |
driver.sys | 是 | 1 |
installer.msi | 是 | 1 |
| 合計 | 4 |
安裝包中包含多少原始碼、資源檔、圖片或設定檔並不會直接影響簽章次數。
重點是:
最终到底有哪些产物被实际签名
Electron
Electron Builder、Electron Forge 等桌面應用程式建置工具可能在一次封裝過程中自動簽署多個檔案。
常見物件包括:
- 主程式
.exe - DLL
- 更新程式
- 解除安裝程式
- 安裝套件
.exe - MSI
- 其他輔助可執行檔
例如:
| 產物 | 簽署次數 |
|---|---|
MyApp.exe | 1 |
ffmpeg.dll | 1 |
update.exe | 1 |
uninstall.exe | 1 |
MyApp Setup.exe | 1 |
| 合計 | 5 |
因此:
一次 Electron Build ≠ 一次签名
應該根據實際簽名的產物數量和每個產物執行的簽名次數計算。
如果 Electron 使用 KSP,並對同一個檔案執行雙簽,該檔案還可能產生兩次遠端簽名。
快速判斷
不知道一次建置會產生多少簽名次數時,可以依次確認:
1. 最终有哪些文件被签名?
2. 每个文件签了几次?
3. 使用的是 SignTool CLI 还是 KSP / Jarsigner?
4. 构建工具有没有自动签额外文件?
可以簡單理解為:
签名次数 = 成功完成的签名动作数量之和
特別注意:
GUI / SignTool CLI 双签 = 1 次
KSP 对同一个文件执行两次底层签名 = 2 次
Jarsigner 每个 JAR 每次成功签名 = 1 次
时间戳 = 0 次
验证签名 = 0 次
时间戳服务器
程式碼簽章通常會同時使用時間戳服務。
時間戳可以證明數位簽章在特定時間已經存在,從而使驗證方能夠結合簽章憑證、時間戳憑證、撤銷狀態和驗證策略判斷簽章的有效性。
程式碼簽章常見兩種時間戳協定:
| 協定 | 說明 |
|---|---|
| Authenticode | Microsoft 傳統時間戳協定,主要用於相容舊式 Windows 程式碼簽章流程 |
| RFC 3161 | 通用時間戳協定,適合現代程式碼簽章場景 |
現代程式碼簽章場景通常優先使用 RFC 3161。
RFC 3161
RFC 3161 時間戳請求傳送的是待時間戳資料的摘要,而不是原始檔案。
基本流程:
代码签名
↓
计算待时间戳数据摘要
↓
发送摘要到 TSA
↓
TSA 返回时间戳令牌
↓
写入最终签名
時間戳記權杖通常包含:
- 資料摘要。
- 時間戳記簽發時間。
- TSA 策略。
- TSA 數位簽章。
時間戳記伺服器不會因為添加時間戳記而額外消耗 sslTrus 程式碼簽署次數。
常用時間戳記伺服器
以下端點適用於常見程式碼簽署情境。
正式使用前,應重新確認對應提供者的最新官方文件、服務策略與可用性。
Microsoft
http://timestamp.acs.microsoft.com
主要用於 RFC 3161 時間戳。
適合作為 Windows 現代程式碼簽章場景的時間戳候選。
範例:
--timestamp-rfc3161=http://timestamp.acs.microsoft.com
Microsoft SignTool:
/tr http://timestamp.acs.microsoft.com
/td SHA256
Sectigo
http://timestamp.sectigo.com
支援:
- Authenticode
- RFC 3161
可用於 Windows 和其他支援相應協定的程式碼簽署工具。
Sectigo 對批次呼叫存在服務端使用要求,正式環境應根據其當前官方政策控制呼叫頻率。
DigiCert
http://timestamp.digicert.com
支援 RFC 3161,可用於 Microsoft Authenticode 等程式碼簽章情境。
Certum
http://time.certum.pl
支援:
- Authenticode
- RFC 3161
Certum 官方程式碼簽章資料涵蓋 Windows 和 Java JAR 簽章情境。
GlobalSign
http://timestamp.globalsign.com/tsa/r45standard
目前 GlobalSign 程式碼簽章資料使用該 RFC 3161 時間戳記地址。
不建議繼續使用已不在目前官方程式碼簽章文件中的歷史 GlobalSign 地址。
SSL.com
http://ts.ssl.com
支持 RFC 3161,不支援傳統 Authenticode 時間戳記協定。
如果目標簽署工具或舊系統對 TSA 使用的金鑰演算法存在相容性限制,應在正式環境接入前進行實際驗證。
時間戳記伺服器比較
| 提供者 | 位址 | Authenticode | RFC 3161 |
|---|---|---|---|
| Microsoft | http://timestamp.acs.microsoft.com | 未確認 | 支援 |
| Sectigo | http://timestamp.sectigo.com | 支援 | 支援 |
| DigiCert | http://timestamp.digicert.com | 未確認 | 支援 |
| Certum | http://time.certum.pl | 支援 | 支援 |
| GlobalSign | http://timestamp.globalsign.com/tsa/r45standard | 未確認 | 支援 |
| SSL.com | http://ts.ssl.com | 不支援 | 支援 |
表中的「支援」描述的是對應提供者公開資料所確認的通訊協定能力。
時間戳記服務政策可能發生變化,正式環境設定前應重新核對提供者目前的官方資料。
受限時間戳記服務
部分時間戳記伺服器雖然提供 RFC 3161 服務,但不能直接當作匿名公用 TSA 使用。
QuoVadis
公開的 RFC 3161 位址包括:
http://ts.quovadisglobal.com/eu
http://ts.quovadisglobal.com/ch
該服務要求預先註冊呼叫端出口 IP,因此接入前需要完成相應授權。
Apple
http://timestamp.apple.com/ts01
屬於 Apple 程式碼簽署生態使用的時間戳服務。
不應將其直接作為 Windows Authenticode 的通用時間戳伺服器。
測試型時間戳服務
某些公開 RFC 3161 服務較適合協定測試,而不是直接作為生產程式碼簽署 TSA。
例如:
https://freetsa.org/tsr
這類服務可能使用自己的 CA 和 TSA 證書。
因此不能假定:
Windows
macOS
Java
其他代码签名验证器
默认都会信任其证书链。
生产环境应使用目标平台实际验证签名产物。
生产环境检查
将一个时间戳服务器加入生产配置前,建议至少确认:
- 服务商官方资料明确公布该端点。
- 服务商明确支持所需时间戳协议。
- 使用 SHA-256 或更强的时间戳摘要算法。
- 目标系统能够验证 TSA 的完整证书链。
- DNS、代理、防火墙和出口网络可以稳定访问 TSA。
- 已确认认证方式、速率限制、区域限制和服务条款。
- 使用实际签名产物完成验签测试。
不要仅通过:
浏览器可以打开
HTTP 返回 200
判斷時間戳伺服器是否適合程式碼簽署。
必須使用實際簽署工具傳送時間戳請求,並對最終產物執行驗證。
時間戳選擇建議
對於現代 Windows SHA-2 程式碼簽署,通常優先選擇支援 RFC 3161 的時間戳服務。
例如:
Microsoft
Sectigo
DigiCert
Certum
GlobalSign
最終選擇應綜合考量:
- 目標作業系統。
- 簽名工具。
- TSA 證書鏈。
- 網路可達性。
- 區域限制。
- 調用頻率限制。
- 服務條款。
- 服務等級協定。
- 實際簽名產物驗證結果。
如果證書提供者對時間戳服務有明確要求,應優先遵循對應證書策略和服務商要求。
相關整合方式
不同整合方式會使用本頁中的簽名次數和時間戳規則:
| 使用情境 | 文件 |
|---|---|
| SignTool CLI | 用戶端工具 |
| Windows KSP / CSP | Windows Provider |
| Jarsigner | Java 整合 |
| GitHub Actions、Electron Builder、Advanced Installer | CI/CD 與建置工具 |
| 直接調用遠端簽名介面 | API 整合 |