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


Câu trả lời:


363

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 hoặc mới hơn: Windows Server 2012, Windows Server 2012 R2 hoặc Windows 8.1 thì MakeCert hiện không được chấp nhận 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 đề nghị các Public Key Infrastructure Powershell (PSPKI) Mô-đun .

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 một cơ quan chứng nhận 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 snapin Chứng chỉ MMC, 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 snapin MMC), 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ó signtool /tlà:

  • 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).


Có cách nào để điền vào trường địa chỉ email của chứng chỉ bằng phương pháp này không? Nhấp chuột phải vào exe> thuộc tính> chữ ký số hiển thị email là "không khả dụng" sau khi ký.
cronoklee

Nếu bạn gặp lỗi "quá nhiều tham số" thì bạn kiểm tra xem bạn đã vô tình chỉnh sửa một trong những dấu gạch nối. Không thể - gõ lại dấu gạch nối - không sao chép dán.
fiat

8
@cronoklee Để điền vào trường email của chứng chỉ, chỉ cần thêm E=your@email. Ví dụ:makecert -pe -n "CN=My SPC,E=email@domain" ........
Rob W

1
Bạn không cần cờ khóa Sử dụng mở rộng -eku 1.3.6.1.5.5.7.3.3để chứng chỉ có thể được sử dụng để ký mã (Tôi biết powershell không thể ký tập lệnh nếu thiếu nó)
Scott Chamberlain

1
@AdamPhelps, Windows sẽ không "học" để tin vào chứng chỉ của bạn. Người dùng của bạn cần cài đặt chứng chỉ CA trong cửa hàng Root. Nói chung, đây là một ý tưởng tồi (vì chứng chỉ CA gốc có thể được sử dụng cho mục đích bất chính). Nó có thể có ý nghĩa trong một kịch bản doanh nghiệp, mặc dù.
Roger Lipscombe

36

Như đã nêu trong câu trả lời, để sử dụng một cách không được chấp nhận để ký vào 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@yourdomain.com -Type CodeSigning -CertStoreLocation cert:\CurrentUser\My
  1. 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ẽ làm cho công việc này phù hợp với các trường hợp 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 (theo thumprint hoặc nhà phát hành).

  1. 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
  1. Nhập nó dưới dạng quyền chứng chỉ gốc.
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root
  1. Ký tên tập lệnh (giả sử ở đây có tên script.ps1, sửa đường dẫn cho phù hợp).
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 được thông tin chi tiết hơn và một số trợ giúp khắc phục sự cố trong bài viết này .


Cảm ơn vì điều này. Tôi nên bắt đầu từ câu trả lời dưới cùng đầu tiên!
mdiehl13

Cảm ơn bạn. Điều này đã giải quyết tất cả các vấn đề của tôi khi cố gắng làm cho quá trình 'có vẻ đơn giản' này hoạt động.
Dave

1
Tôi đã gặp lỗi trên "2." do (get-ChildItem ...)trả lại nhiều hơn một chứng chỉ, vì vậy tôi đặt "[0]" vào cuối và nó đã hoạt động. Như trongExport-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt
lundman

1
@Lara cảm ơn vì đã phản hồi Tôi đã thêm một số thông tin theo ngữ cảnh để giúp dễ dàng hơn ngay cả khi thử với lượng caffeine thấp ;-)
chaami

1
@Lara cảm ơn vì đã báo hiệu, tôi đã không chú ý trong khi chỉnh sửa, có vẻ như StackOverflow bây giờ khó tính hơn về cú pháp của các khối và bây giờ yêu cầu một dòng mới trước khi bắt đầu mã.
chaami

21

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

4
Nếu bạn muốn sử dụng điều này để ký trình điều khiển, bạn cần nhập chứng chỉ CA vào cửa hàng máy. Ví dụ của tôi nhập nó vào cửa hàng người dùng, điều này tốt cho hầu hết các phần mềm, cho mục đích thử nghiệm / nội bộ.
Roger Lipscombe

20

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ỉ :
$ cert = New-SelfSignCertert -DnsName www.yourwebsite.com -Type CodeSigning -CertStoreLocation Chứng chỉ: \ CurrentUser \ My

2) đặt mật khẩu cho nó :
$ CertPassword = ConvertTo-SecureString -String "my_passowrd" -ForceTHERAsPlainText

3) Xuất nó :
Xuất-PfxCertert -Cert "cert: \ CurrentUser \ My \ $ ($ cert.Thumbprint)" -FilePath "d: \ selfsigncert.pfx" -Password $ CertPassword

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


Bước tùy chọn: Bạn cũng sẽ yêu cầu 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"


JerryGidel bạn có biết cách chuyển đổi chứng chỉ tự ký thành Chứng chỉ tin cậy CA Root không?
Ông Heelis

12

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-SelfSignCertertExport-PfxCertert .

Hướng dẫn trong phần Tạo chứng chỉ tự ký với PowerShell .


3
Điều đáng nói là, ngay cả khi bạn cài đặt bản cập nhật WMF để nhận PowerShell 4.0 trên Windows 7, bạn sẽ không có quyền truy cập vào lệnh này. Nó dường như là Win8 hoặc Server 2012 trở lên.
Daniel Yankowsky
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.