เอกสารอ้างอิงคำสั่ง 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 / -k | ACCESS_KEY | อ่านตัวแปรสภาพแวดล้อมโดยอัตโนมัติเมื่อพารามิเตอร์ว่างเปล่า |
| Access Secret | --access-secret / -s | ACCESS_SECRET | อ่านตัวแปรสภาพแวดล้อมโดยอัตโนมัติเมื่อพารามิเตอร์ว่างเปล่า |
export ACCESS_KEY="your-access-key"
export ACCESS_SECRET="your-access-secret"
ที่อยู่บริการระยะไกล ถูกควบคุมโดยพารามิเตอร์ --address ซึ่งรองรับค่าต่อไปนี้:
| ค่าพารามิเตอร์ | ที่อยู่บริการจริง |
|---|---|
nicsrs | https://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 | -1 | false | เปิดใช้งานลายเซ็น SHA1 |
--sha2 | -2 | true | เปิดใช้งานลายเซ็น 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 | วัตถุประสงค์ |
|---|---|---|
--timestamp | http://timestamp.sectigo.com | การประทับเวลา SHA1 Authenticode |
--timestamp-rfc3161 | http://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 |