跳至主要内容

參考資料

本頁面整理 sslTrus 遠端程式碼簽章服務在不同整合方式中共用的參考資訊,包括:

  • 程式碼簽章次數計算規則。
  • Authenticode 和 RFC 3161 時間戳記通訊協定。
  • 常用程式碼簽章時間戳記伺服器。
  • 正式環境選擇時間戳記服務時需要關注的事項。

簽章次數計算

簽章次數依實際完成的簽章動作計算。

簡單理解:

一个文件成功完成一次签名 = 一次签名次数

簽名次數不是按照原始程式碼檔案數量計算,也不是按照一次建置、一次打包或一次 CI/CD Pipeline 計算。

例如:

100 个源代码文件

编译生成 1 个 app.exe

app.exe 成功签名一次

1 次签名

如果一次建置產生:

app.exe
helper.dll
installer.msi

並且三個檔案都分別完成簽署,則:

签名次数 = 3 次

基本規則

簽名次數主要看:

  1. 最終有哪些檔案或物件被簽名。
  2. 每個物件實際完成了多少次簽名。
  3. 使用的是普通用戶端簽名,還是 KSP、Jarsigner 等底層簽名呼叫方式。
  4. 建置工具是否自動簽名了額外的 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,再附加 SHA12 次
分別簽章 app.exehelper.dlluninstall.exe3 次

因此:

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 -verify0 次
產生驗證用 keystore0 次

因此:

每个 JAR 每次成功完成签名 = 1 次

安裝套件

安裝套件需要區分:

  1. 安裝套件內部的可執行檔案。
  2. 安裝套件本身。

例如:

app.exe       → 簽署 1 次
installer.msi → 簽署 1 次

則:

合计 = 2 次

如果還有其他檔案:

檔案是否簽章簽章次數
app.exe1
helper.dll1
driver.sys1
installer.msi1
合計4

安裝包中包含多少原始碼、資源檔、圖片或設定檔並不會直接影響簽章次數。

重點是:

最终到底有哪些产物被实际签名

Electron

Electron Builder、Electron Forge 等桌面應用程式建置工具可能在一次封裝過程中自動簽署多個檔案。

常見物件包括:

  • 主程式 .exe
  • DLL
  • 更新程式
  • 解除安裝程式
  • 安裝套件 .exe
  • MSI
  • 其他輔助可執行檔

例如:

產物簽署次數
MyApp.exe1
ffmpeg.dll1
update.exe1
uninstall.exe1
MyApp Setup.exe1
合計5

因此:

一次 Electron Build ≠ 一次签名

應該根據實際簽名的產物數量和每個產物執行的簽名次數計算。

如果 Electron 使用 KSP,並對同一個檔案執行雙簽,該檔案還可能產生兩次遠端簽名。

快速判斷

不知道一次建置會產生多少簽名次數時,可以依次確認:

1. 最终有哪些文件被签名?
2. 每个文件签了几次?
3. 使用的是 SignTool CLI 还是 KSP / Jarsigner?
4. 构建工具有没有自动签额外文件?

可以簡單理解為:

签名次数 = 成功完成的签名动作数量之和

特別注意:

GUI / SignTool CLI 双签                = 1 次
KSP 对同一个文件执行两次底层签名 = 2 次
Jarsigner 每个 JAR 每次成功签名 = 1 次
时间戳 = 0 次
验证签名 = 0 次

时间戳服务器

程式碼簽章通常會同時使用時間戳服務。

時間戳可以證明數位簽章在特定時間已經存在,從而使驗證方能夠結合簽章憑證、時間戳憑證、撤銷狀態和驗證策略判斷簽章的有效性。

程式碼簽章常見兩種時間戳協定:

協定說明
AuthenticodeMicrosoft 傳統時間戳協定,主要用於相容舊式 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 使用的金鑰演算法存在相容性限制,應在正式環境接入前進行實際驗證。

時間戳記伺服器比較

提供者位址AuthenticodeRFC 3161
Microsofthttp://timestamp.acs.microsoft.com未確認支援
Sectigohttp://timestamp.sectigo.com支援支援
DigiCerthttp://timestamp.digicert.com未確認支援
Certumhttp://time.certum.pl支援支援
GlobalSignhttp://timestamp.globalsign.com/tsa/r45standard未確認支援
SSL.comhttp://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
其他代码签名验证器

默认都会信任其证书链。

生产环境应使用目标平台实际验证签名产物。

生产环境检查

将一个时间戳服务器加入生产配置前,建议至少确认:

  1. 服务商官方资料明确公布该端点。
  2. 服务商明确支持所需时间戳协议。
  3. 使用 SHA-256 或更强的时间戳摘要算法。
  4. 目标系统能够验证 TSA 的完整证书链。
  5. DNS、代理、防火墙和出口网络可以稳定访问 TSA。
  6. 已确认认证方式、速率限制、区域限制和服务条款。
  7. 使用实际签名产物完成验签测试。

不要仅通过:

浏览器可以打开
HTTP 返回 200

判斷時間戳伺服器是否適合程式碼簽署。

必須使用實際簽署工具傳送時間戳請求,並對最終產物執行驗證。

時間戳選擇建議

對於現代 Windows SHA-2 程式碼簽署,通常優先選擇支援 RFC 3161 的時間戳服務。

例如:

Microsoft
Sectigo
DigiCert
Certum
GlobalSign

最終選擇應綜合考量:

  • 目標作業系統。
  • 簽名工具。
  • TSA 證書鏈。
  • 網路可達性。
  • 區域限制。
  • 調用頻率限制。
  • 服務條款。
  • 服務等級協定。
  • 實際簽名產物驗證結果。

如果證書提供者對時間戳服務有明確要求,應優先遵循對應證書策略和服務商要求。

相關整合方式

不同整合方式會使用本頁中的簽名次數和時間戳規則:

使用情境文件
SignTool CLI用戶端工具
Windows KSP / CSPWindows Provider
JarsignerJava 整合
GitHub Actions、Electron Builder、Advanced InstallerCI/CD 與建置工具
直接調用遠端簽名介面API 整合