ฉันจะสร้างใบรับรองแบบลงนามด้วยตนเองสำหรับการเซ็นชื่อรหัสบน Windows ได้อย่างไร


คำตอบ:


363

อัปเดตคำตอบ

หากคุณกำลังใช้รุ่นต่อไปนี้ Windows หรือในภายหลัง: Windows Server 2012, Windows Server 2012 R2 หรือ Windows 8.1 แล้วmakecert จะเลิกตอนนี้และไมโครซอฟท์แนะนำให้ใช้PowerShell Cmdletใหม่ SelfSignedCertificate

หากคุณใช้เวอร์ชั่นที่เก่ากว่าเช่น Windows 7 คุณจะต้องติดกับ MakeCert หรือโซลูชันอื่น บางคนแนะนำโครงสร้างพื้นฐานกุญแจสาธารณะ Powershell (PSPKI) โมดูล

คำตอบเดิม

แม้ว่าคุณจะสามารถสร้างใบรับรองการเซ็นชื่อด้วยตนเอง (SPC - ใบรับรองผู้เผยแพร่ซอฟต์แวร์ ) ได้ในครั้งเดียว แต่ฉันต้องการทำสิ่งต่อไปนี้:

การสร้างสิทธิ์ออกใบรับรองด้วยตนเอง (CA)

makecert -r -pe -n "CN=My CA" -ss CA -sr CurrentUser ^
         -a sha256 -cy authority -sky signature -sv MyCA.pvk MyCA.cer

(^ = อนุญาตให้บรรทัดคำสั่งแบตช์ห่อบรรทัด)

สิ่งนี้จะสร้างใบรับรองแบบลงนามด้วยตนเอง (-r) พร้อมกับคีย์ส่วนตัวที่ส่งออกได้ (-pe) มันชื่อว่า "My CA" และควรใส่ไว้ในที่เก็บ CA สำหรับผู้ใช้ปัจจุบัน เรากำลังใช้อัลกอริทึมSHA-256 กุญแจสำคัญสำหรับการลงนาม (-sky)

คีย์ส่วนตัวควรเก็บไว้ในไฟล์ MyCA.pvk และใบรับรองในไฟล์ MyCA.cer

การนำเข้าใบรับรอง CA

เนื่องจากไม่มีจุดในการมีใบรับรอง CA หากคุณไม่เชื่อถือคุณจะต้องนำเข้าใบรับรองที่เก็บใบรับรอง Windows คุณสามารถใช้ SnapS ใบรับรอง MMC ได้ แต่จากบรรทัดคำสั่ง:

certutil -user -addstore Root MyCA.cer

การสร้างใบรับรองการลงนามรหัส (SPC)

makecert -pe -n "CN=My SPC" -a sha256 -cy end ^
         -sky signature ^
         -ic MyCA.cer -iv MyCA.pvk ^
         -sv MySPC.pvk MySPC.cer

มันเหมือนกันกับข้างบน แต่เรามีคีย์ผู้ออกใบรับรองและใบรับรอง (สวิตช์ -ic และ -iv)

นอกจากนี้เรายังต้องการแปลงใบรับรองและรหัสเป็นไฟล์ PFX:

pvk2pfx -pvk MySPC.pvk -spc MySPC.cer -pfx MySPC.pfx

หากคุณต้องการปกป้องไฟล์ PFX ให้เพิ่มสวิตช์ -po มิฉะนั้น PVK2PFX จะสร้างไฟล์ PFX โดยไม่มีข้อความรหัสผ่าน

การใช้ใบรับรองสำหรับการลงนามรหัส

signtool sign /v /f MySPC.pfx ^
              /t http://timestamp.url MyExecutable.exe

( ดูว่าทำไมการประทับเวลาอาจมีความสำคัญ )

หากคุณนำเข้าไฟล์ PFX ไปยังที่เก็บใบรับรอง (คุณสามารถใช้ PVKIMPRT หรือ MMC snapin) คุณสามารถลงชื่อรหัสได้ดังนี้:

signtool sign /v /n "Me" /s SPC ^
              /t http://timestamp.url MyExecutable.exe

URL การประทับเวลาที่เป็นไปได้สำหรับsigntool /t:

  • http://timestamp.verisign.com/scripts/timstamp.dll
  • http://timestamp.globalsign.com/scripts/timstamp.dll
  • http://timestamp.comodoca.com/authenticode

เอกสาร Microsoft เต็มรูปแบบ

ดาวน์โหลด

สำหรับผู้ที่ไม่ใช่นักพัฒนา. NET คุณจะต้องมีสำเนาของกรอบ Windows SDK และ. NET ลิงค์ปัจจุบันมีให้ที่นี่: SDK & .NET (ซึ่งติดตั้ง makecert C:\Program Files\Microsoft SDKs\Windows\v7.1) ไมล์สะสมของคุณอาจแตกต่างกันไป

MakeCert พร้อมใช้งานจากพรอมต์คำสั่ง Visual Studio Visual Studio 2015 มีและสามารถเปิดใช้งานได้จากเมนูเริ่มใน Windows 7 ภายใต้ "Prompt Command Command for VS2015" หรือ "พร้อมรับคำสั่งเครื่องมือ VS2015 x64 Native Tools Command Prompt" (อาจเป็นทั้งหมดในโฟลเดอร์เดียวกัน)


มีวิธีการเติมฟิลด์ที่อยู่อีเมลของใบรับรองโดยใช้วิธีนี้หรือไม่? คลิกขวา exe> Properties> ลายเซ็นดิจิทัลแสดงอีเมลว่า "ไม่พร้อมใช้งาน" หลังจากเซ็นชื่อ
cronoklee

หากคุณได้รับข้อผิดพลาด "พารามิเตอร์มากเกินไป" คุณจะตรวจสอบว่าไม่ได้แก้ไขเครื่องหมายขีดกลางหนึ่งอันโดยไม่ตั้งใจ ความล้มเหลวนั้น - พิมพ์ยัติภังค์ใหม่ - อย่าคัดลอกแปะ
คำสั่งที่

8
@cronoklee E=your@emailต้องการเติมข้อมูลอีเมลของใบรับรองเพียงแค่เพิ่ม เช่น:makecert -pe -n "CN=My SPC,E=email@domain" ........
Rob W

1
คุณไม่จำเป็นต้องใช้การตั้งค่าคีย์การใช้งานแบบขยาย-eku 1.3.6.1.5.5.7.3.3เพื่อให้ใบรับรองสามารถใช้สำหรับการเซ็นชื่อรหัส (ฉันรู้ว่า powershell ล้มเหลวในการเซ็นสคริปต์หากไม่มี)
Scott Chamberlain

1
@ AdamPhelps, Windows จะไม่ "เรียนรู้" เพื่อเชื่อถือใบรับรองของคุณ ผู้ใช้ของคุณต้องติดตั้งใบรับรอง CA ในที่เก็บรูท นี่คือความคิดที่ไม่ดี (เนื่องจากใบรับรอง CA หลักสามารถใช้เพื่อวัตถุประสงค์ที่ชั่วร้าย) แม้ว่ามันจะสมเหตุสมผลในสถานการณ์ขององค์กร
Roger Lipscombe

36

ตามที่ระบุไว้ในคำตอบเพื่อที่จะใช้วิธีเลิกไม่ใช่จะลงนามในสคริปต์ของคุณเองควรใช้ใหม่ SelfSignedCertificate

  1. สร้างกุญแจ:
New-SelfSignedCertificate -DnsName email@yourdomain.com -Type CodeSigning -CertStoreLocation cert:\CurrentUser\My
  1. ส่งออกใบรับรองโดยไม่มีคีย์ส่วนตัว:
Export-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt

[0] จะใช้งานได้กับกรณีที่คุณมีใบรับรองมากกว่าหนึ่งใบ ... ทำให้ดัชนีตรงกับใบรับรองที่คุณต้องการใช้ ... หรือใช้วิธีการกรอง (โดย thumprint หรือผู้ออกใบรับรอง)

  1. นำเข้าเป็นผู้เผยแพร่ที่เชื่อถือได้
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher
  1. นำเข้าเป็นหน่วยงานผู้ออกใบรับรองรูท
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root
  1. เซ็นชื่อสคริปต์ (สมมติว่านี่คือชื่อ script.ps1 แก้ไขพา ธ ให้สอดคล้อง)
Set-AuthenticodeSignature .\script.ps1 -Certificate (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)

เห็นได้ชัดว่าเมื่อคุณตั้งค่าคีย์แล้วคุณสามารถลงชื่อสคริปต์อื่น ๆ ได้ด้วย
คุณจะได้รับข้อมูลรายละเอียดเพิ่มเติมและบางความช่วยเหลือแก้ไขปัญหาในบทความนี้


ขอบคุณสำหรับสิ่งนี้ ฉันควรเริ่มต้นจากคำตอบด้านล่างก่อน!
mdiehl13

ขอบคุณ. วิธีนี้แก้ไขปัญหาทั้งหมดของฉันในการพยายามทำให้กระบวนการ 'ดูเหมือนง่าย' นี้ทำงาน
เดฟ

1
ฉันพบข้อผิดพลาดใน "2. " เนื่องจาก(get-ChildItem ...)คืนใบรับรองมากกว่าหนึ่งใบดังนั้นฉันจึงใส่ "[0]" ในตอนท้ายและใช้งานได้ ในฐานะที่เป็นExport-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt
Lundman

1
@ Lara ขอบคุณสำหรับคำติชมฉันได้เพิ่มข้อมูลตามบริบทบางอย่างเพื่อให้ง่ายขึ้นแม้ในขณะที่พยายามคาเฟอีนต่ำ ;-)
chaami

1
@ Lara ขอบคุณสำหรับการส่งสัญญาณฉันไม่ได้ใส่ใจอย่างใกล้ชิดในขณะที่การแก้ไขดูเหมือนว่า StackOverflow ตอนนี้มีความจู้จี้จุกจิกมากขึ้นเกี่ยวกับไวยากรณ์ของบล็อกและตอนนี้ต้องมีบรรทัดใหม่ก่อนที่จะเริ่มต้นของรหัส
chaami

21

คำตอบของโรเจอร์มีประโยชน์มาก

ฉันมีปัญหาเล็กน้อยในการใช้และได้รับกล่องโต้ตอบข้อผิดพลาด "Windows ไม่สามารถตรวจสอบผู้เผยแพร่ซอฟต์แวร์ไดรเวอร์นี้" ได้ กุญแจสำคัญคือการติดตั้งใบรับรองการทดสอบรูทด้วย

certutil -addstore Root Demo_CA.cer

คำตอบของโรเจอร์ที่ไม่ครอบคลุมค่อนข้าง

นี่คือแบตช์ไฟล์ที่ใช้งานได้สำหรับฉัน (กับไฟล์. inf ของฉันไม่รวมอยู่ด้วย) มันแสดงให้เห็นถึงวิธีการทำทุกอย่างตั้งแต่ต้นจนจบโดยไม่มีเครื่องมือ GUI เลย (ยกเว้นการแจ้งรหัสผ่านสองสามข้อ)

REM Demo of signing a printer driver with a self-signed test certificate.
REM Run as administrator (else devcon won't be able to try installing the driver)
REM Use a single 'x' as the password for all certificates for simplicity.

PATH %PATH%;"c:\Program Files\Microsoft SDKs\Windows\v7.1\Bin";"c:\Program Files\Microsoft SDKs\Windows\v7.0\Bin";c:\WinDDK\7600.16385.1\bin\selfsign;c:\WinDDK\7600.16385.1\Tools\devcon\amd64

makecert -r -pe -n "CN=Demo_CA" -ss CA -sr CurrentUser ^
   -a sha256 -cy authority -sky signature ^
   -sv Demo_CA.pvk Demo_CA.cer

makecert -pe -n "CN=Demo_SPC" -a sha256 -cy end ^
   -sky signature ^
   -ic Demo_CA.cer -iv Demo_CA.pvk ^
   -sv Demo_SPC.pvk Demo_SPC.cer

pvk2pfx -pvk Demo_SPC.pvk -spc Demo_SPC.cer ^
   -pfx Demo_SPC.pfx ^
   -po x

inf2cat /drv:driver /os:XP_X86,Vista_X64,Vista_X86,7_X64,7_X86 /v

signtool sign /d "description" /du "www.yoyodyne.com" ^
   /f Demo_SPC.pfx ^
   /p x ^
   /v driver\demoprinter.cat

certutil -addstore Root Demo_CA.cer

rem Needs administrator. If this command works, the driver is properly signed.
devcon install driver\demoprinter.inf LPTENUM\Yoyodyne_IndustriesDemoPrinter_F84F

rem Now uninstall the test driver and certificate.
devcon remove driver\demoprinter.inf LPTENUM\Yoyodyne_IndustriesDemoPrinter_F84F

certutil -delstore Root Demo_CA

4
หากคุณต้องการใช้สิ่งนี้ในการเซ็นชื่อไดรเวอร์คุณจะต้องนำเข้าใบรับรอง CA ไปที่ร้านขายเครื่อง ตัวอย่างของฉันนำเข้ามาในร้านค้าของผู้ใช้ซึ่งใช้ได้ดีกับซอฟต์แวร์ส่วนใหญ่สำหรับการทดสอบ / ภายใน
Roger Lipscombe

20

ค่อนข้างง่ายโดยใช้คำสั่งNew-SelfSignedCertificateใน Powershell เปิด PowerShell และเรียกใช้คำสั่งทั้งสามนี้

1) สร้างใบรับรอง :
$ cert = New-SelfSignedCertificate -DnsName www.yourwebsite.com - รหัสประเภทการลงทะเบียน --CertStoreLocation Cert: \ CurrentUser \ My

2) ตั้งรหัสผ่านสำหรับมัน :
$ CertPassword = ConvertTo-SecureString -String "my_passowrd" -Force –AsPlainText

3) ส่งออกมัน :
ส่งออก -PertxCertificate - ใบรับรอง "ใบรับรอง: \ CurrentUser \ My \ $ ($ ใบรับรอง. พิมพ์)" -FilePath "d: \ selfsigncert.pfx" - รหัสผ่าน $ CertPassword

ใบรับรองของคุณselfsigncert.pfxจะอยู่ที่ @D:/


ขั้นตอนเพิ่มเติม:คุณจะต้องเพิ่มรหัสผ่านใบรับรองในตัวแปรสภาพแวดล้อมของระบบ ทำได้โดยป้อนด้านล่างในคำสั่ง:setx CSC_KEY_PASSWORD "my_password"


JerryGoyal คุณรู้วิธีแปลงใบรับรองที่ลงนามด้วยตนเองเป็นใบรับรอง CA Root Trusted หรือไม่
Mr Heelis

12

ในฐานะของ PowerShell 4.0 (Windows 8.1 / Server 2012 R2) ก็เป็นไปได้ที่จะทำให้ใบรับรองใน Windows โดยไม่ต้องmakecert.exe

คำสั่งที่คุณต้องมีใหม่ SelfSignedCertificateและการส่งออกและ PfxCertificate

คำแนะนำในการสร้างใบรับรองลงนามด้วยตนเองกับ PowerShell


3
เป็นมูลค่าการกล่าวขวัญว่าแม้ว่าคุณจะติดตั้งการปรับปรุง WMF เพื่อรับ PowerShell 4.0 บน Windows 7 คุณจะไม่สามารถเข้าถึงคำสั่งนี้ได้ ดูเหมือนว่าจะเป็น Win8 หรือ Server 2012 หรือใหม่กว่า
Daniel Yankowsky
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.