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 Transform | Enveloped Signature Transform |
| Canonicalization | Inclusive Canonical XML 1.0 |
| 摘要演算法 | SHA-256 |
| 簽名演算法 | RSA-SHA256 |
KeyInfo | X509Data,預設包含葉子憑證 |
呼叫方無需自行計算摘要或建構 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_KEYSSLTRUS_JARSIGNER_ACCESS_SECRETSSLTRUS_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 檔案。