跳至主要内容

sslTrusJarsigner 使用指南

準備工作​

使用前請準備:

  • JDK 8 或更高版本。
  • sslTrusJarsigner-<version>.jar。
  • Access Key、Access Secret 和證書編號。
  • 待簽名的 JAR 檔案或 TIMS/1E XML 檔案。

請將本文中的 <version>、憑證、證書編號和檔案路徑替換為實際值。

下載​

透過以下頁面下載最新發行套件:

下載最新套件

下載並解壓縮 ZIP 檔案後,可獲得:

  • sslTrusJarsigner-<version>.jar
  • SHA-256 校驗檔案

建議在使用前根據校驗檔案核對 JAR 檔案的完整性。

檢查執行環境​

執行以下指令確認 Java、jarsigner 和工具檔案可用:

java -version
jarsigner -help
java -jar sslTrusJarsigner-<version>.jar --version

查看幫助資訊:

java -jar sslTrusJarsigner-<version>.jar --help

配置憑證​

Linux 和 macOS​

export SSLTRUS_JARSIGNER_ACCESS_KEY="YOUR_ACCESS_KEY"
export SSLTRUS_JARSIGNER_ACCESS_SECRET="YOUR_ACCESS_SECRET"
export SSLTRUS_JARSIGNER_CERT_CODE="YOUR_CERT_CODE"

Windows PowerShell​

$env:SSLTRUS_JARSIGNER_ACCESS_KEY = "YOUR_ACCESS_KEY"
$env:SSLTRUS_JARSIGNER_ACCESS_SECRET = "YOUR_ACCESS_SECRET"
$env:SSLTRUS_JARSIGNER_CERT_CODE = "YOUR_CERT_CODE"

如果服務人員提供了專用服務地址,還需要設定:

Linux 和 macOS:

export SSLTRUS_JARSIGNER_URL="YOUR_SERVICE_URL"

Windows PowerShell:

$env:SSLTRUS_JARSIGNER_URL = "YOUR_SERVICE_URL"

未提供專用服務地址時,請不要設定該變數。

簽名​

以下範例將 app-unsigned.jar 簽名後儲存為 app-signed.jar。固定參數請按範例原樣使用。

JDK 9 或更高版本​

Linux 和 macOS:

jarsigner \
-keystore NONE \
-storetype SSLTRUS \
-storepass SSLTRUS \
-providerPath "sslTrusJarsigner-<version>.jar" \
-providerClass com.racent.codesign.SSLTrusProvider \
-sigalg SHA256withRSA \
-tsa http://timestamp.sectigo.com \
-signedjar "app-signed.jar" \
"app-unsigned.jar" \
"$SSLTRUS_JARSIGNER_CERT_CODE"

Windows PowerShell:

jarsigner `
-keystore NONE `
-storetype SSLTRUS `
-storepass SSLTRUS `
-providerPath "sslTrusJarsigner-<version>.jar" `
-providerClass com.racent.codesign.SSLTrusProvider `
-sigalg SHA256withRSA `
-tsa http://timestamp.sectigo.com `
-signedjar "app-signed.jar" `
"app-unsigned.jar" `
"$env:SSLTRUS_JARSIGNER_CERT_CODE"

JDK 8​

請先確認 JAVA_HOME 指向完整的 JDK 8。

Linux 和 macOS:

jarsigner \
-J-cp \
-J"$JAVA_HOME/lib/tools.jar:sslTrusJarsigner-<version>.jar" \
-keystore NONE \
-storetype SSLTRUS \
-storepass SSLTRUS \
-providerClass com.racent.codesign.SSLTrusProvider \
-sigalg SHA256withRSA \
-tsa http://timestamp.sectigo.com \
-signedjar "app-signed.jar" \
"app-unsigned.jar" \
"$SSLTRUS_JARSIGNER_CERT_CODE"

Windows PowerShell:

jarsigner `
-J-cp `
"-J$env:JAVA_HOME\lib\tools.jar;sslTrusJarsigner-<version>.jar" `
-keystore NONE `
-storetype SSLTRUS `
-storepass SSLTRUS `
-providerClass com.racent.codesign.SSLTrusProvider `
-sigalg SHA256withRSA `
-tsa http://timestamp.sectigo.com `
-signedjar "app-signed.jar" `
"app-unsigned.jar" `
"$env:SSLTRUS_JARSIGNER_CERT_CODE"
注意
  • 命令最後的證書編號必須與 SSLTRUS_JARSIGNER_CERT_CODE 一致。
  • 建議始終使用 -signedjar 產生新檔案,避免覆蓋原始 JAR。
  • 如果不需要時間戳,可以刪除 -tsa 及其後的位址。

簽章 XML(XMLDSig)​

TIMS/1E XML 使用 sign-xml 命令產生 XML Digital Signature(XMLDSig) enveloped 簽章。私鑰仍只保留在遠端簽章服務中;工具會在本機產生 XMLDSig 所需的摘要和簽章結構,再由遠端服務完成 RSA 簽章。

Linux 和 macOS:

java -jar sslTrusJarsigner-<version>.jar \
sign-xml \
"input.xml" \
"signed.xml" \
"$SSLTRUS_JARSIGNER_CERT_CODE"

Windows PowerShell:

java -jar sslTrusJarsigner-<version>.jar `
sign-xml `
"input.xml" `
"signed.xml" `
"$env:SSLTRUS_JARSIGNER_CERT_CODE"

簽名格式​

產生的簽名使用 XMLDSig 標準命名空間 http://www.w3.org/2000/09/xmldsig#,Signature 節點作為根節點的最後一個子節點寫入輸出檔案。目前簽名 profile 固定如下:

項目固定值
簽名類型Enveloped signature
簽名範圍整份 XML 文件,Reference URI=""
Reference TransformEnveloped Signature Transform
CanonicalizationInclusive Canonical XML 1.0
摘要演算法SHA-256
簽名演算法RSA-SHA256
KeyInfoX509Data,預設包含葉子憑證

呼叫方無需自行計算摘要或建構 SignatureValue。工具會使用遠端憑證的葉子憑證填入 KeyInfo/X509Data,並在 XML 中寫入最終的 SignatureValue。

包含完整憑證鏈​

默认輸出僅包含葉憑證,以減小 XML 體積並與常見 TIMS/1E 檔案保持一致。若接收方要求 XML 內攜帶中繼憑證鏈,請在命令末尾加入 --full-chain:

java -jar sslTrusJarsigner-<version>.jar \
sign-xml \
"input.xml" \
"signed.xml" \
"$SSLTRUS_JARSIGNER_CERT_CODE" \
--full-chain

--full-chain 只影響 KeyInfo/X509Data 中的證書列表,不改變簽名範圍、摘要演算法或簽名演算法。該選項可以放在證書編號之前或之後;未提供證書編號時,使用 SSLTRUS_JARSIGNER_CERT_CODE。

輸入與使用限制​

  • 輸入必須是格式正確的 XML,且包含根節點。
  • 輸入檔案不能已包含 XMLDSig Signature 節點;工具會拒絕重複簽名,避免產生無法確認簽名範圍的檔案。
  • 目前僅支援整份文件的 enveloped 簽名;不支援 detached signature、依元素 ID 簽名或自訂 XMLDSig profile。
  • 工具會停用 XML 外部實體和外部 DTD 載入,因此不接受依賴外部實體展開的 XML。
  • 簽名完成後不要再修改 XML 的結構、文字、屬性或命名空間;任何此類變更都會導致 XMLDSig 驗證失敗。應始終保留原始輸入檔案,並將簽名結果寫入新的輸出檔案。

產生驗證檔案​

簽名後,可以產生驗證所需的 JKS 檔案:

Linux 和 macOS:

java -jar sslTrusJarsigner-<version>.jar \
generate-keystore \
"$SSLTRUS_JARSIGNER_CERT_CODE" \
"verify.jks" \
"SSLTRUS"

Windows PowerShell:

java -jar sslTrusJarsigner-<version>.jar `
generate-keystore `
"$env:SSLTRUS_JARSIGNER_CERT_CODE" `
"verify.jks" `
"SSLTRUS"

verify.jks 僅用於驗證簽名,不能用於執行簽名。

驗證簽名​

使用生成的 verify.jks 驗證已簽名 JAR:

jarsigner \
-verify \
-verbose \
-certs \
-keystore "verify.jks" \
-storetype JKS \
-storepass "SSLTRUS" \
"app-signed.jar"

如果只需要查看 JAR 的簽章資訊:

jarsigner -verify -verbose -certs "app-signed.jar"

常見問題​

提示缺少 Access Key、Access Secret 或證書編號​

請確認目前終端已設定以下環境變數:

  • SSLTRUS_JARSIGNER_ACCESS_KEY
  • SSLTRUS_JARSIGNER_ACCESS_SECRET
  • SSLTRUS_JARSIGNER_CERT_CODE

設定環境變數後,需要在同一個終端視窗中執行簽名指令。

提示 無效選項: -providerPath​

目前使用的是 JDK 8。請改用本文中的 JDK 8 簽名指令。

提示無法載入 com.racent.codesign.SSLTrusProvider​

請檢查:

  • sslTrusJarsigner-<version>.jar 路徑是否正確。
  • 檔名中的版本號是否與實際檔案一致。
  • JDK 8 的 JAVA_HOME 是否指向完整 JDK。

提示找不到證書或 alias​

請檢查:

  • 證書編號是否正確。
  • 指令最後的證書編號是否與環境變數一致。
  • 目前憑證是否有權使用該證書。

簽名請求失敗​

請檢查:

  • 網路連線、代理和防火牆設定。
  • 憑證和證書編號是否正確。
  • 專用服務位址是否依服務人員提供的內容設定。

如仍無法解決,請保留完整錯誤訊息並聯絡技術支援。提交錯誤訊息前,請刪除或遮蓋憑證。

時間戳失敗​

請確認目前網路能夠存取指令中的時間戳位址。如果業務允許,可以暫時刪除 -tsa 及其後的位址,再次執行簽名以定位問題。

安全注意事項​

  • 不要在原始碼、文件、共用腳本或映像中儲存真實 Access Secret。
  • 不要對外共用包含憑證的指令行、終端歷史或流水線日誌。
  • 自動化環境應使用受保護的金鑰變數注入憑證。
  • 請從可信發布管道下載工具,並在使用前校驗檔案完整性。
  • 建議保留未簽名的原始 JAR 檔案。