คู่มือการใช้งาน sslTrusJarsigner
การเตรียมความพร้อม
ก่อนใช้งาน กรุณาเตรียม:
- JDK 8 หรือเวอร์ชันที่ใหม่กว่า
sslTrusJarsigner-<version>.jar- Access Key, Access Secret และหมายเลขใบรับรอง
- ไฟล์ JAR ที่รอการลงนาม หรือไฟล์ XML TIMS/1E
กรุณาแทนที่ <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
การกำหนดค่า Credential
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 เพื่อสร้างลายเซ็นแบบ enveloped ของ XML Digital Signature (XMLDSig) คีย์ส่วนตัวยังคงถูกเก็บไว้ในบริการลงนามระยะไกลเท่านั้น เครื่องมือจะสร้างโครงสร้างไดเจสต์และลายเซ็นที่จำเป็นสำหรับ 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 certificate |
ผู้เรียกใช้ไม่จำเป็นต้องคำนวณค่า digest หรือสร้าง SignatureValue ด้วยตนเอง เครื่องมือจะใช้ leaf certificate จากใบรับรองระยะไกลในการเติม KeyInfo/X509Data และเขียน SignatureValue สุดท้ายลงใน XML
รวม certificate chain แบบเต็ม
ตามค่าเริ่มต้น ผลลัพธ์จะรวมเฉพาะใบรับรองปลายทางเท่านั้น เพื่อลดขนาดไฟล์ 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 และ DTD ภายนอก จึงไม่รับ XML ที่ต้องอาศัยการขยายจาก external entity
- หลังจากลงนามเสร็จแล้ว อย่าแก้ไขโครงสร้าง ข้อความ แอตทริบิวต์ หรือเนมสเปซของ 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 ต้นฉบับที่ยังไม่ได้ลงนามไว้