it-swarm-vi.tech

Làm cách nào để tạo chứng chỉ tự ký để ký mã trên Windows?

Làm cách nào để tạo chứng chỉ tự ký để ký mã bằng các công cụ từ SDK Windows?

204
Roger Lipscombe

Cập nhật câu trả lời

Nếu bạn đang sử dụng các phiên bản Windows sau trở lên: Windows Server 2012, Windows Server 2012 R2 hoặc Windows 8.1 thì MakeCert hiện không dùng nữa và Microsoft khuyên bạn nên sử dụng PowerShell Cmdlet New-SelfSignCertert .

Nếu bạn đang sử dụng phiên bản cũ hơn như Windows 7, bạn sẽ cần phải sử dụng MakeCert hoặc một giải pháp khác. Một số người đề xuất Mô-đun Công cụ cơ sở hạ tầng khóa công khai (PSPKI) .

Câu trả lời gốc

Mặc dù bạn có thể tạo chứng chỉ ký mã tự ký (SPC - Chứng chỉ nhà xuất bản phần mềm ) trong một lần, tôi thích làm như sau:

Tạo cơ quan cấp chứng chỉ tự ký (CA)

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

(^ = cho phép dòng lệnh bó để ngắt dòng)

Điều này tạo ra một chứng chỉ tự ký (-r), với khóa riêng có thể xuất (-pe). Nó có tên là "CA của tôi" và nên được đặt trong cửa hàng CA cho người dùng hiện tại. Chúng tôi đang sử dụng thuật toán SHA-256 . Chìa khóa có nghĩa là để ký (-sky).

Khóa riêng phải được lưu trữ trong tệp MyCA.pvk và chứng chỉ trong tệp MyCA.cer.

Nhập chứng chỉ CA

Vì không có điểm nào có chứng chỉ CA nếu bạn không tin tưởng nó, bạn sẽ cần nhập chứng chỉ đó vào kho chứng chỉ Windows. Bạn có thể sử dụng Chứng chỉ MMC snapin, nhưng từ dòng lệnh:

certutil -user -addstore Root MyCA.cer

Tạo chứng chỉ ký mã (SPC)

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

Nó khá giống như trên, nhưng chúng tôi đang cung cấp khóa và chứng chỉ của nhà phát hành (các công tắc -ic và -iv).

Chúng tôi cũng muốn chuyển đổi chứng chỉ và khóa thành tệp PFX:

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

Nếu bạn muốn bảo vệ tệp PFX, hãy thêm công tắc -po, nếu không, PVK2PFX tạo tệp PFX không có cụm mật khẩu.

Sử dụng chứng chỉ để ký mã

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

( Xem tại sao dấu thời gian có thể quan trọng )

Nếu bạn nhập tệp PFX vào kho lưu trữ chứng chỉ (bạn có thể sử dụng PVKIMPRT hoặc MMC snapin), bạn có thể ký mã như sau:

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

Một số URL dấu thời gian có thể có cho signtool /t là:

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

Tài liệu đầy đủ của Microsoft

Tải xuống

Đối với những người không phải là nhà phát triển .NET, bạn sẽ cần một bản sao của Windows SDK và .NET framework. Một liên kết hiện tại có sẵn ở đây: SDK & .NET (cài đặt makecert trong C:\Program Files\Microsoft SDKs\Windows\v7.1). Số dặm của bạn có thể thay đổi.

MakeCert có sẵn từ Dấu nhắc Lệnh của Visual Studio. Visual Studio 2015 đã có nó và nó có thể được khởi chạy từ Menu bắt đầu trong Windows 7 trong "Nhắc lệnh của nhà phát triển cho VS 2015" hoặc "Nhắc lệnh công cụ bản địa VS2015 x64" (có thể là tất cả chúng trong cùng một thư mục).

344
Roger Lipscombe

Câu trả lời của Rogers rất hữu ích.

Tuy nhiên, tôi đã gặp một chút rắc rối khi sử dụng nó và liên tục nhận được hộp thoại lỗi "Windows không thể xác minh nhà xuất bản của phần mềm trình điều khiển này". Chìa khóa là cài đặt chứng chỉ gốc thử nghiệm với

certutil -addstore Root Demo_CA.cer

mà câu trả lời của Rogers không bao gồm.

Đây là một tệp bó làm việc cho tôi (với tệp .inf của tôi, không bao gồm). Nó cho thấy cách thực hiện tất cả từ đầu đến cuối, không có công cụ GUI nào cả (ngoại trừ một vài lời nhắc mật khẩu).

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
19
Dan Kegel

Như đã nêu trong câu trả lời, để sử dụng một cách không được chấp nhận để ký tập lệnh của riêng bạn, người ta nên sử dụng New-SelfSignCertert .

  1. Tạo khóa:
    [.__.] New-SelfSignedCertificate -DnsName [email protected] -Type CodeSigning -CertStoreLocation cert:\CurrentUser\My

  2. Xuất chứng chỉ không có khóa riêng:
    [.__.] Export-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt [0] sẽ giúp công việc này hoạt động khi bạn có nhiều hơn một chứng chỉ ... Rõ ràng làm cho chỉ mục khớp với chứng chỉ bạn muốn sử dụng ... hoặc sử dụng một cách để lọc (bởi thumprint hoặc tổ chức phát hành).

  3. Nhập nó dưới dạng Nhà xuất bản đáng tin cậy
    [.__.] Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher

  4. Nhập nó như một cơ quan chứng nhận Root.
    [.__.] Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root

  5. Ký vào kịch bản.
    [.__.] Set-AuthenticodeSignature .\script.ps1 -Certificate (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)

Rõ ràng một khi bạn đã thiết lập khóa, bạn chỉ cần ký bất kỳ tập lệnh nào khác với nó.
[.__.] Bạn có thể nhận thêm thông tin chi tiết và một số trợ giúp khắc phục sự cố trong bài viết này .

14
chaami

Kể từ PowerShell 4.0 (Windows 8.1/ Server 2012 R2), có thể tạo chứng chỉ trong Windows mà không cần makecert.exe .

Các lệnh bạn cần là New-SelfSignCertertXuất-PfxCertert .

Các hướng dẫn nằm trong Tạo chứng chỉ tự ký bằng PowerShell.

12
Yishai

Thật dễ dàng khi sử dụng lệnh New-SelfSignCertert trong Powershell. Mở powershell và chạy 3 lệnh này.

1) Tạo chứng chỉ :
[.___

2) đặt mật khẩu cho nó :
[.__.] $ CertPassword = ConvertTo-SecureString -String "my_passowrd" -Force ERICAsPlainText

3) Xuất nó :
[.___.]

Chứng chỉ của bạn selfsigncert.pfx sẽ được đặt @ D:/


Bước tùy chọn: Bạn cũng sẽ cần thêm mật khẩu chứng chỉ vào các biến môi trường hệ thống. làm như vậy bằng cách nhập vào bên dưới trong cmd: setx CSC_KEY_PASSWORD "my_password"

12
JerryGoyal