Windows'da kod imzalama için kendinden imzalı bir sertifikayı nasıl oluştururum?


Yanıtlar:


363

Güncellenmiş Yanıt

Aşağıdaki Windows sürümlerini veya daha yenisini kullanıyorsanız : Windows Server 2012, Windows Server 2012 R2 veya Windows 8.1, MakeCert artık kullanımdan kaldırılmıştır ve Microsoft , PowerShell Cmdlet Yeni-SelfSignedCertificate kullanılmasını önerir .

Windows 7 gibi daha eski bir sürüm kullanıyorsanız, MakeCert veya başka bir çözümle devam etmeniz gerekir. Bazı insanlar önermek Açık Anahtar Altyapısı Powershell (PSPKI) Modülü .

Orijinal Yanıt

Tek seferde kendinden imzalı bir kod imzalama sertifikası (SPC - Yazılım Yayıncı Sertifikası ) oluşturabilirsiniz, ancak aşağıdakileri yapmayı tercih ederim:

Kendinden imzalı bir sertifika yetkilisi (CA) oluşturma

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

(^ = toplu komut satırının satırı kaydırmasına izin ver)

Bu, dışa aktarılabilir bir özel anahtarla (-pe) kendinden imzalı (-r) bir sertifika oluşturur. Adı "CA'm" ve geçerli kullanıcı için CA deposuna konulmalıdır. Biz kullanıyoruz SHA-256 algoritması. Anahtar, imzalamak içindir (-sky).

Özel anahtarın MyCA.pvk dosyasında ve sertifikanın MyCA.cer dosyasında depolanması gerekir.

CA sertifikasını içe aktarma

Güvenmiyorsanız CA sertifikasına sahip olmanın bir anlamı olmadığından, sertifikayı Windows sertifika deposuna aktarmanız gerekir. Sen olabilir ama komut satırından, Sertifikalar MMC ekranından kullanın:

certutil -user -addstore Root MyCA.cer

Kod imzalama sertifikası (SPC) oluşturma

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

Yukarıdakiyle hemen hemen aynıdır, ancak bir yayıncı anahtarı ve sertifikası (-ic ve -iv anahtarları) sağlıyoruz.

Ayrıca sertifikayı ve anahtarı bir PFX dosyasına dönüştürmek isteyeceğiz:

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

PFX dosyasını korumak istiyorsanız, -po anahtarını ekleyin, aksi takdirde PVK2PFX, parolasız bir PFX dosyası oluşturur.

Kod imzalamak için sertifikayı kullanma

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

( Zaman damgalarının neden önemli olabileceğini görün )

PFX dosyasını sertifika deposuna alırsanız (PVKIMPRT veya MMC ek bileşenini kullanabilirsiniz), kodu aşağıdaki gibi imzalayabilirsiniz:

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

İçin bazı olası zaman damgası URL'leri signtool /t:

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

Tam Microsoft belgeleri

İndirilenler

.NET geliştiricisi olmayanlar için Windows SDK ve .NET çerçevesinin bir kopyasına ihtiyacınız olacaktır. Bir akım bağlantı burada mevcuttur: SDK & .NET (ki MakeCert yükler C:\Program Files\Microsoft SDKs\Windows\v7.1). Kilometreniz değişebilir.

MakeCert, Visual Studio Komut İstemi'nden edinilebilir. Visual Studio 2015 var ve Windows 7'de Başlat Menüsü'nden "VS 2015 için Geliştirici Komut İstemi" veya "VS2015 x64 Yerel Araçlar Komut İstemi" (muhtemelen hepsi aynı klasörde) altında başlatılabilir.


Bu yöntemi kullanarak sertifikanın e-posta adresi alanını doldurmanın bir yolu var mı? Sağ tıklama exe> özellikler> dijital imzalar, e-postayı imzaladıktan sonra "kullanılamıyor" olarak gösterir.
cronoklee

"Çok fazla parametre" hatası alıyorsanız, tire işaretlerinden birini yanlışlıkla düzenlemediğinizi kontrol edersiniz. Başarısız olursa - kısa çizgileri yeniden yazın - yapıştırmayı kopyalamayın.
fiat

8
@cronoklee Sertifikanın e-posta alanını doldurmak için eklemeniz yeterlidir E=your@email. Örn:makecert -pe -n "CN=My SPC,E=email@domain" ........
Rob W

1
-eku 1.3.6.1.5.5.7.3.3Sertifikayı kod imzalamak için kullanılabilecek şekilde Genişletilmiş Kullanım anahtar bayrağına ihtiyacınız yok mu (powershell eksikse komut dosyalarını imzalayamadığını biliyorum)
Scott Chamberlain

1
@AdamPhelps, Windows sertifikanıza güvenmeyi "öğrenmez". Kullanıcılarınızın Kök deposuna CA sertifikası yüklemeleri gerekir. Bu, genel olarak konuşursak, kötü bir fikirdir (çünkü kök CA sertifikaları hain amaçlarla kullanılabilir). Bununla birlikte , bir kurumsal senaryoda mantıklı olabilir .
Roger Lipscombe

36

Yanıtta belirtildiği gibi, kendi komut dosyanızı imzalamak için kullanımdan kaldırılmış bir yol kullanmak için, New-SelfSignedCertificate kullanılmalıdır .

  1. Anahtarı oluşturun:
New-SelfSignedCertificate -DnsName email@yourdomain.com -Type CodeSigning -CertStoreLocation cert:\CurrentUser\My
  1. Sertifikayı özel anahtar olmadan dışa aktarın:
Export-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt

[0], birden fazla sertifikanız olduğu durumlar için bu çalışmayı gerçekleştirecektir ... Açıkça, dizinin kullanmak istediğiniz sertifikayla eşleşmesini sağlayın ... veya filtrelemek için bir yöntem kullanın (tromprint veya yayıncı tarafından).

  1. Güvenilir Yayıncı olarak içe aktarın
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher
  1. Kök sertifika yetkilisi olarak içe aktarın.
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root
  1. Komut dosyasını imzalayın (burada script.ps1 olarak adlandırılırsa, yolu buna göre düzeltin).
Set-AuthenticodeSignature .\script.ps1 -Certificate (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)

Açıkçası, anahtarı ayarladıktan sonra, diğer komut dosyalarını onunla imzalayabilirsiniz. Bu makalede
daha ayrıntılı bilgi ve sorun giderme ile ilgili yardım alabilirsiniz .


Bunun için teşekkürler. Önce alttan cevaplardan başlamalıydım!
mdiehl13

Teşekkür ederim. Bu, bu 'görünüşte basit' süreci işe almaya çalışırken tüm sorunlarımı çözdü.
Dave,

1
"2" ile ilgili bir hata aldım. (get-ChildItem ...)birden fazla sertifika dönen nedeniyle , ben "[0]" sonuna koymak ve işe yaradı. AsExport-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt
lundman

1
@Lara geri bildirim için teşekkürler Düşük kafein üzerinde çalışırken bile daha kolay hale getirmek için bazı bağlamsal bilgiler ekledim ;-)
chaami 13

1
@ İşaretleme için teşekkürler, düzenleme yaparken çok dikkat etmedim, StackOverflow şimdi blokların sözdizimi hakkında daha seçici ve şimdi kodun başlangıcından önce yeni bir satır gerektiriyor gibi görünüyor.
chaami

21

Roger'ın cevabı çok yardımcı oldu.

Yine de kullanmakta biraz sorun yaşadım ve kırmızı "Windows bu sürücü yazılımının yayıncısını doğrulayamıyor" hata iletişim kutusunu almaya devam ettim. Anahtar, test kök sertifikasını

certutil -addstore Root Demo_CA.cer

Roger'ın cevabı pek örtmedi.

İşte benim için çalışan bir toplu iş dosyası (benim .inf dosyası ile dahil değildir). GUI araçları olmadan baştan sona nasıl yapılacağını gösterir (birkaç şifre istemi hariç).

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
Bunu sürücüleri imzalamak için kullanmak istiyorsanız, CA sertifikasını makine deposuna almanız gerekir. Örneğim, test / dahili amaçlar için çoğu yazılım için uygun olan kullanıcı deposuna aktarır.
Roger Lipscombe

20

Powershell'deki New-SelfSignedCertificate komutunu kullanmak oldukça kolaydır . Powershell'i açın ve bu 3 komutu çalıştırın.

1) Sertifika oluşturun :
$ cert = New-SelfSignedCertificate -DnsName www.yourwebsite.com -Tip KoduSigning -CertStoreLocation Cert: \ CurrentUser \ My

2) şifresini ayarlayın :
$ CertPassword = ConvertTo-SecureString -String "my_passowrd" -Force –AsPlainText

3) Dışa aktarın :
Export-PfxCertificate -Cert "cert: \ CurrentUser \ My \ $ ($ cert.Thumbprint)" -FilePath "d: \ selfsigncert.pfx" -Şifre $ CertPassword

Selfsigncert.pfx sertifikanız @D:/


İsteğe bağlı adım: Ayrıca sistem ortamı değişkenlerine sertifika parolası eklemeniz gerekir. cmd olarak aşağıya girerek bunu yapın:setx CSC_KEY_PASSWORD "my_password"


JerryGoyal, kendinden imzalı bir sertifikayı CA ​​Kök Güvenilir Sertifikasına nasıl dönüştüreceğinizi biliyor musunuz?
Bay Heelis

12

PowerShell 4.0'dan (Windows 8.1 / Server 2012 R2) makecert.exe olmadan Windows'ta bir sertifika oluşturmak mümkündür .

İhtiyacınız olan komutlar New-SelfSignedCertificate ve Export-PfxCertificate'dur .

Talimatlar PowerShell ile Kendinden İmzalı Sertifikalar Oluşturma bölümünde verilmiştir .


3
Windows 7'de PowerShell 4.0 almak için WMF güncellemesini yükleseniz bile, bu komuta erişemeyeceğinizi belirtmek gerekir. Win8 veya Server 2012 veya üstü gibi görünüyor.
Daniel Yankowsky
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.