การอ้างอิงคำสั่ง 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=
- เฉพาะที่อยู่ 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 หากจำเป็น |