คู่มือการใช้งาน 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
การกำหนดค่า Credentials
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 ต้นฉบับ - หากไม่ต้องการ timestamp ให้ลบ
-tsaและที่อยู่ที่ตามหลังออกได้
การลงนาม XML (XMLDSig)
XML ของ TIMS/1E ใช้คำสั่ง 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 จะถูกเขียนลงในไฟล์เอาต์พุตเป็นโหนดย่อยสุดท้ายของโหนดราก โปรไฟล์ลายเซ็นปัจจุบันถูกกำหนดไว้ดังนี้:
| รายการ | ค่าคงที่ |
|---|---|
| ประเภทลายเซ็น | Enveloped signature |
| ขอบเขตลายเซ็น | เอกสาร XML ทั้งหมด Reference URI="" |
| Reference Transform | Enveloped Signature Transform |
| Canonicalization | Inclusive Canonical XML 1.0 |
| อัลกอริทึมไดเจสต์ | SHA-256 |
| อัลกอริทึมลายเซ็น | RSA-SHA256 |
KeyInfo | X509Data โดยค่าเริ่มต้นรวมถึงใบรับรอง leaf |
ผู้เรียกใช้ไม่จำเป็นต้องคำนวณไดเจสต์เองหรือสร้าง SignatureValue เครื่องมือจะใช้ใบรับรอง leaf จากใบรับรองระยะไกลในการเติม KeyInfo/X509Data และเขียน SignatureValue สุดท้ายลงใน XML
รวมถึงสายใบรับรองที่สมบูรณ์
ผลลัพธ์เริ่มต้นจะรวมเฉพาะใบรับรองปลายทางเท่านั้น เพื่อลดขนาดไฟล์ 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 external entity และ external 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ถูกต้องหรือไม่ - หมายเลขเวอร์ชันในชื่อไฟล์ตรงกับไฟล์จริงหรือไม่
JAVA_HOMEของ JDK 8 ชี้ไปยัง JDK ฉบับเต็มหรือไม่
แจ้งเตือนว่าไม่พบใบรับรองหรือ alias
โปรดตรวจสอบ:
- หมายเลขใบรับรองถูกต้องหรือไม่
- หมายเลขใบรับรองท้ายคำสั่งตรงกับตัวแปรสภาพแวดล้อมหรือไม่
- ข้อมูลประจำตัวปัจจุบันมีสิทธิ์ใช้ใบรับรองนั้นหรือไม่
คำขอลงนามล้มเหลว
โปรดตรวจสอบ:
- การเชื่อมต่อเครือข่าย พร็อกซี และการตั้งค่าไฟร์วอลล์
- ข้อมูลประจำตัวและหมายเลขใบรับรองถูกต้องหรือไม่
- ที่อยู่บริการเฉพาะถูกกำหนดค่าตามที่เจ้าหน้าที่บริการให้ไว้หรือไม่
หากยังไม่สามารถแก้ไขได้ โปรดเก็บข้อความข้อผิดพลาดฉบับเต็มและติดต่อฝ่ายสนับสนุนทางเทคนิค ก่อนส่งข้อความข้อผิดพลาด โปรดลบหรือปิดบังข้อมูลประจำตัว
การประทับเวลาล้มเหลว
โปรดยืนยันว่าเครือข่ายปัจจุบันสามารถเข้าถึงที่อยู่การประทับเวลาในคำสั่งได้ หากธุรกิจอนุญาต สามารถลบ -tsa และที่อยู่ถัดจากนั้นชั่วคราว แล้วรันคำสั่งลงนามอีกครั้งเพื่อระบุปัญหา
ข้อควรระวังด้านความปลอดภัย
- อย่าบันทึก Access Secret จริงในซอร์สโค้ด เอกสาร สคริปต์ที่แชร์ หรืออิมเมจ
- อย่าแชร์บรรทัดคำสั่ง ประวัติเทอร์มินัล หรือบันทึกไปป์ไลน์ที่มีข้อมูลประจำตัวแก่บุคคลภายนอก
- สภาพแวดล้อมอัตโนมัติควรใช้ตัวแปรคีย์ที่ได้รับการป้องกันเพื่อแทรกข้อมูลประจำตัว
- โปรดดาวน์โหลดเครื่องมือจากช่องทางเผยแพร่ที่น่าเชื่อถือ และตรวจสอบความสมบูรณ์ของไฟล์ก่อนใช้งาน
- แนะนำให้เก็บไฟล์ JAR ต้นฉบับที่ยังไม่ได้ลงนามไว้