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ว่างพาธไฟล์ผลลัพธ์ หากเว้นว่างและไม่ได้เปิดใช้การเขียนทับ ระบบจะสร้างชื่อไฟล์เริ่มต้นโดยอัตโนมัติ
--overridefalseไฟล์ผลลัพธ์เขียนทับไฟล์ต้นฉบับ
--sha1-1falseเปิดใช้งานลายเซ็น SHA1
--sha2-2trueเปิดใช้งานลายเซ็น SHA2
--timestampautoที่อยู่การประทับเวลา SHA1 Authenticode auto ใช้ที่อยู่เริ่มต้น สตริงว่างหมายถึงปิดใช้งาน
--timestamp-rfc3161autoที่อยู่การประทับเวลา SHA2 RFC3161 auto ใช้ที่อยู่เริ่มต้น สตริงว่างหมายถึงปิดใช้งาน
--desc-nว่างข้อความคำอธิบายโปรแกรมที่เขียนลงในลายเซ็น
--url-uว่างเปล่าURL ข้อมูลโปรแกรมสำหรับเขียนลายเซ็น
--nesttrueเก็บลายเซ็นเดิมไว้และเพิ่มลายเซ็นซ้อนทับ เมื่อ false ให้ล้างลายเซ็นเดิม
--verifyfalseเมื่อเพิ่มลายเซ็น หากใบรับรองไม่ได้รับความไว้วางใจ ให้ส่งกลับข้อผิดพลาด
--dry-runfalseใช้ใบรับรองทดสอบในเครื่องเพื่อสร้างลายเซ็น โดยไม่เรียกใช้อินเทอร์เฟซการลงนามระยะไกล
รูปแบบพารามิเตอร์บูลีน

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

  • ถูกต้อง: --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=
หมายเหตุ
  • เฉพาะที่อยู่ไทม์สแตมป์ที่ขึ้นต้นด้วย http เท่านั้นที่จะถูกนำไปใช้
  • สำหรับ SHA1 จะให้สิทธิ์ใช้ --timestamp ก่อน หากไม่ใช่ที่อยู่ HTTP จะลองใช้ --timestamp-rfc3161
  • สำหรับ SHA2 จะใช้ --timestamp-rfc3161
  • หากเพิ่มไทม์สแตมป์ SHA2 ล้มเหลว ระบบจะลองใหม่โดยอัตโนมัติหนึ่งครั้งระหว่างที่อยู่เริ่มต้นของ Microsoft และ Sectigo
  • ความล้มเหลวของไทม์สแตมป์ไม่จำเป็นต้องทำให้การลงนามล้มเหลวเสมอไป CLI จะบันทึกข้อผิดพลาดและเก็บผลการลงนามที่ยังไม่มีไทม์สแตมป์ไว้

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

ใช้ตัวแปรสภาพแวดล้อมเพื่อระบุข้อมูลประจำตัว ลงนามด้วย 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