Skip to main content

การอ้างอิงคำสั่ง signtool sign

หมายเหตุ

signtool ในบทความนี้หมายถึง CLI ไคลเอนต์การลงนามโค้ดระยะไกลของ sslTrus ไม่ใช่ signtool.exe ที่มาพร้อมกับ Microsoft Windows SDK เมื่อใช้เครื่องมือ Windows SDK จะระบุอย่างชัดเจนว่าเป็น Microsoft signtool.exe

signtool sign ดำเนินการลงนามระยะไกลกับไฟล์ในเครื่องโดยตรง CLI จะดึงข้อมูลที่รอการลงนามในเครื่อง เรียกใช้บริการระยะไกลเพื่อลงนามด้วยคีย์ส่วนตัว จากนั้นเขียนลายเซ็น ตราเวลา และข้อมูลใบรับรองกลับลงในไฟล์ผลลัพธ์

signtool sign [flags]

ดูวิธีใช้และเวอร์ชัน:

signtool --help
signtool --version

การกำหนดค่ารับรอง​

คำสั่ง sign อ่านข้อมูลรับรองการเข้าถึงด้วยวิธีต่อไปนี้:

รายการรับรองพารามิเตอร์ตัวแปรสภาพแวดล้อมคำอธิบาย
Access Key--access-key / -kACCESS_KEYอ่านตัวแปรสภาพแวดล้อมอัตโนมัติเมื่อพารามิเตอร์ว่าง
Access Secret--access-secret / -sACCESS_SECRETอ่านตัวแปรสภาพแวดล้อมอัตโนมัติเมื่อพารามิเตอร์ว่าง
export ACCESS_KEY="your-access-key"
export ACCESS_SECRET="your-access-secret"

ที่อยู่บริการระยะไกลถูกควบคุมโดยพารามิเตอร์ --address รองรับค่าต่อไปนี้:

ค่าพารามิเตอร์ที่อยู่บริการจริง
nicsrshttps://ssl.face.nicsrs.com
ค่าว่าง, racent หรือค่าอื่นใดhttps://ssl.face.racent.com
หมายเหตุ
  • ACCESS_KEY และ ACCESS_SECRET เป็นชื่อตัวแปรสภาพแวดล้อมที่ถูกอ่านจริง SIGNTOOL_ACCESS_KEY / SIGNTOOL_ACCESS_SECRET จะไม่ถูกอ่านโดยอัตโนมัติจาก CLI ปัจจุบัน
  • ไม่แนะนำให้เขียน Access Secret ลงในประวัติ shell หรือคลังสคริปต์ ควรใช้ตัวแปรสภาพแวดล้อมที่ฉีดตอนรันไทม์หรือตัวแปร CI ที่ปลอดภัยเป็นอันดับแรก

คำอธิบายพารามิเตอร์​

พารามิเตอร์ชื่อย่อค่าเริ่มต้นคำอธิบาย
--address-aว่างตัวระบุที่อยู่บริการระยะไกล ไม่ใช่พารามิเตอร์ส่งผ่าน URL
--access-key-kว่างเปล่าเมื่อว่างเปล่าจะอ่าน ACCESS_KEY
--access-secret-sว่างเปล่าเมื่อว่างเปล่าจะอ่าน ACCESS_SECRET
--cert-code-cว่างเปล่าจำเป็นต้องกรอก หมายเลขใบรับรอง
--file-fว่างเปล่าจำเป็นต้องกรอก พาธของไฟล์ที่ต้องการเซ็นชื่อ ต้องไม่ใช่ไดเรกทอรี
--out-oว่างเปล่าพาธของไฟล์ผลลัพธ์ หากเว้นว่างและไม่ได้เปิดใช้งานการเขียนทับ จะสร้างชื่อไฟล์เริ่มต้นโดยอัตโนมัติ
--override—falseเขียนทับไฟล์ต้นฉบับด้วยไฟล์ผลลัพธ์
--sha1-1falseเปิดใช้งานลายเซ็น SHA1
--sha2-2trueเปิดใช้งานลายเซ็น SHA2
--timestamp—autoที่อยู่การประทับเวลา SHA1 Authenticode auto ใช้ที่อยู่เริ่มต้น สตริงว่างหมายถึงปิดใช้งาน
--timestamp-rfc3161—autoที่อยู่การประทับเวลา SHA2 RFC3161 auto ใช้ที่อยู่เริ่มต้น สตริงว่างหมายถึงปิดใช้งาน
--desc-nว่างข้อความอธิบายโปรแกรมที่เขียนลงในลายเซ็น
--url-uว่างเปล่าURL ข้อมูลโปรแกรมที่เขียนลงในลายเซ็น
--nest—trueเก็บลายเซ็นที่มีอยู่แล้วและเพิ่มลายเซ็นซ้อน; เมื่อ false ให้ล้างลายเซ็นที่มีอยู่
--verify—falseเมื่อเพิ่มลายเซ็น หากใบรับรองไม่ได้รับความเชื่อถือ จะส่งคืนข้อผิดพลาด
--dry-run—falseใช้ใบรับรองทดสอบภายในเครื่องเพื่อสร้างลายเซ็น โดยไม่เรียกใช้อินเทอร์เฟซการลงนามระยะไกล
รูปแบบพารามิเตอร์แบบบูลีน

พารามิเตอร์แบบบูลีนต้องใช้รูปแบบ 参数=值 เท่านั้น ไม่รองรับการคั่นด้วยช่องว่าง:

  • ถูกต้อง: --sha1=true --sha2=false
  • ไม่ถูกต้อง: --sha1 true --sha2 false

กฎบังคับ​

ก่อนดำเนินการจะตรวจสอบเงื่อนไขต่อไปนี้ หากเงื่อนไขใดไม่เป็นไปตามที่กำหนด จะแจ้งข้อผิดพลาดและออกจากระบบ:

  • --access-key หรือ ACCESS_KEY ต้องมีอยู่
  • --access-secret หรือ ACCESS_SECRET ต้องมีอยู่
  • --cert-code ต้องมีอยู่
  • --file ต้องมีอยู่ และต้องไม่ใช่ไดเรกทอรี
  • ต้องเปิดใช้งานอย่างน้อยหนึ่งรายการระหว่าง --sha1 และ --sha2

กฎไฟล์ผลลัพธ์​

เมื่อไม่ได้ระบุ --out:

--overrideพฤติกรรมผลลัพธ์
false (ค่าเริ่มต้น)แสดงผลไปยังไดเรกทอรีเดียวกับไฟล์อินพุต โดยชื่อไฟล์คือ ${name}.signed.${yyyyMMdd.HHmmss}${ext}
trueเขียนทับไฟล์อินพุตโดยตรง

ตัวอย่าง:

app.exe    → app.signed.20260611.153000.exe
driver.sys → driver.signed.20260611.153000.sys
หมายเหตุ

--override=true จะเขียนทับไฟล์เดิม โปรดตรวจสอบให้แน่ใจว่าได้สำรองข้อมูลไว้ก่อนดำเนินการ หากการลงนามล้มเหลว CLI จะพยายามลบไฟล์เอาต์พุตที่ยังไม่สมบูรณ์


การเลือกอัลกอริทึม​

ตามค่าเริ่มต้น จะเปิดใช้งานเฉพาะ SHA2:

signtool sign -c CERT_CODE -f app.exe

ลงนามเฉพาะ SHA1:

signtool sign -c CERT_CODE -f app.exe --sha1=true --sha2=false

ลงนามทั้ง SHA1 และ SHA2 พร้อมกัน:

signtool sign -c CERT_CODE -f app.exe --sha1=true --sha2=true
หมายเหตุ

เมื่อเปิดใช้งาน SHA1 และ SHA2 พร้อมกัน กระบวนการจะจัดการ SHA1 ก่อน แล้วจึงจัดการ SHA2 ปัจจุบัน SHA1 ยังคงได้รับการรองรับ แต่สถานการณ์การลงนามใหม่จะให้ความสำคัญกับ SHA2


การกำหนดค่าการประทับเวลา​

ค่า auto ของ --timestamp และ --timestamp-rfc3161 จะถูกแทนที่ด้วยที่อยู่เริ่มต้นในขั้นตอนการตรวจสอบ:

พารามิเตอร์ค่าจริงของ autoการใช้งาน
--timestamphttp://timestamp.sectigo.comการประทับเวลา SHA1 Authenticode
--timestamp-rfc3161http://timestamp.sectigo.comการประทับเวลา SHA2 RFC3161

บริการประทับเวลา SHA2 แบบกำหนดเอง:

signtool sign \
-c CERT_CODE \
-f app.exe \
--timestamp-rfc3161=http://timestamp.acs.microsoft.com

ปิดการประทับเวลา SHA2:

signtool sign -c CERT_CODE -f app.exe --timestamp-rfc3161=

ปิดการประทับเวลาทั้งหมด:

signtool sign -c CERT_CODE -f app.exe --timestamp= --timestamp-rfc3161=
หมายเหตุ
  • เฉพาะที่อยู่ timestamp ที่ขึ้นต้นด้วย http เท่านั้นที่จะถูกนำไปใช้
  • SHA1 จะให้ความสำคัญกับ --timestamp ก่อน หากไม่ใช่ที่อยู่แบบ HTTP จะลองใช้ --timestamp-rfc3161 แทน
  • SHA2 ใช้ --timestamp-rfc3161
  • เมื่อ SHA2 ล้มเหลวในการเพิ่ม timestamp ระบบจะลองใหม่โดยอัตโนมัติหนึ่งครั้งระหว่างที่อยู่เริ่มต้นของ Microsoft และ Sectigo
  • ความล้มเหลวของ timestamp ไม่จำเป็นต้องทำให้การลงนามล้มเหลวเสมอไป CLI จะบันทึกข้อผิดพลาดและเก็บผลลัพธ์การลงนามที่ไม่มี timestamp ไว้

ตัวอย่างที่ใช้บ่อย​

ใช้ตัวแปรสภาพแวดล้อมให้ข้อมูลประจำตัว ลงนามด้วย SHA2 ตามค่าเริ่มต้น:

export ACCESS_KEY="your-access-key"
export ACCESS_SECRET="your-access-secret"

signtool sign \
--cert-code CERT_CODE \
--file app-unsigned.exe \
--out app-signed.exe

ใช้พารามิเตอร์เพื่อระบุข้อมูลรับรองโดยตรง:

signtool sign \
--access-key "your-access-key" \
--access-secret "your-access-secret" \
--cert-code CERT_CODE \
--file app-unsigned.exe \
--out app-signed.exe

การใช้ที่อยู่ NICSRS:

signtool sign \
--address nicsrs \
--cert-code CERT_CODE \
--file app-unsigned.exe \
--out app-signed.exe

เขียนคำอธิบายโปรแกรมและ URL เว็บไซต์ทางการ:

signtool sign \
-c CERT_CODE \
-f app-unsigned.exe \
-o app-signed.exe \
--desc "Example Application" \
--url "https://example.com"

เพิ่มลายเซ็นซ้อน (โดยคงลายเซ็นเดิมไว้):

signtool sign -c CERT_CODE -f app.exe --nest=true

เขียนทับไฟล์เดิม:

signtool sign -c CERT_CODE -f app.exe --override=true

dry-run ทดลองลงนามในเครื่อง (ไม่เรียกใช้อินเทอร์เฟซระยะไกล):

signtool sign \
-k dummy \
-s dummy \
-c CERT_CODE \
-f app.exe \
--dry-run=true
หมายเหตุ

--dry-run จะไม่เรียกอินเทอร์เฟซการลงชื่อระยะไกล แต่ยังคงอ่านและเขียนไฟล์ในเครื่องและเรียกใช้ใบรับรองที่ลงชื่อด้วยตนเองในเครื่อง ปัจจุบันยังคงผ่านการตรวจสอบความไม่ว่างของข้อมูลประจำตัวและหมายเลขใบรับรอง ดังนั้นตัวอย่างจึงใช้ข้อมูลประจำตัวตัวแทน


ข้อมูลอ้างอิงสำหรับการแก้ไขปัญหา​

ข้อความแสดงข้อผิดพลาดสาเหตุที่เป็นไปได้คำแนะนำในการจัดการ
access key is required...ไม่ได้ส่ง --access-key และไม่ได้ตั้งค่า ACCESS_KEYตั้งค่าตัวแปรสภาพแวดล้อมหรือใช้ -k
access secret is required...ไม่ได้ส่ง --access-secret และไม่ได้ตั้งค่า ACCESS_SECRETตั้งค่าตัวแปรสภาพแวดล้อมหรือใช้ -s
cert code is required...ไม่ได้ส่งหมายเลขใบรับรองใช้ -c CERT_CODE
sha1 or sha2 is required...ปิดใช้งาน SHA1 และ SHA2 พร้อมกันเปิดใช้งานอัลกอริทึมอย่างน้อยหนึ่งรายการ
file <path> is a directory--file ชี้ไปยังไดเรกทอรีแทนที่จะเป็นไฟล์เปลี่ยนเป็นเส้นทางของไฟล์ที่รอการเซ็น
การประทับเวลาล้มเหลวแต่ไฟล์ลายเซ็นถูกสร้างแล้วบริการประทับเวลาไม่พร้อมใช้งานหรือการตรวจสอบห่วงโซ่ใบรับรองล้มเหลวตรวจสอบ URL ประทับเวลา และเปลี่ยน --timestamp-rfc3161 หากจำเป็น