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?
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?
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 .
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:
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.
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
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.
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 /t
là:
http://timestamp.verisign.com/scripts/timstamp.dll
http://timestamp.globalsign.com/scripts/timstamp.dll
http://timestamp.comodoca.com/authenticode
Đố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).
E=your@email
. Ví dụ:makecert -pe -n "CN=My SPC,E=email@domain" ........
-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ó)
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 .
New-SelfSignedCertificate -DnsName email@yourdomain.com -Type CodeSigning -CertStoreLocation cert:\CurrentUser\My
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).
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root
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 .
(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
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
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 \ My2) đặt mật khẩu cho nó :
$ CertPassword = ConvertTo-SecureString -String "my_passowrd" -ForceTHERAsPlainText3) 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"
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-SelfSignCertert và Export-PfxCertert .
Hướng dẫn trong phần Tạo chứng chỉ tự ký với PowerShell .