Bagaimana cara membuat sertifikat yang ditandatangani sendiri untuk penandatanganan kode pada Windows?

Jawaban:

363

Jawaban yang Diperbarui

Jika Anda menggunakan versi Windows berikut atau lebih baru: Windows Server 2012, Windows Server 2012 R2, atau Windows 8.1 maka MakeCert sekarang tidak digunakan lagi , dan Microsoft merekomendasikan untuk menggunakan PowerShell Cmdlet New-SelfSignedCertificate .

Jika Anda menggunakan versi yang lebih lama seperti Windows 7, Anda harus tetap menggunakan MakeCert atau solusi lain. Beberapa orang menyarankan para Public Key Infrastructure Powershell (PSPKI) Modul .

Jawaban Asli

Meskipun Anda dapat membuat sertifikat penandatanganan kode yang ditandatangani sendiri (SPC - Sertifikat Penerbit Perangkat Lunak ) dalam sekali jalan, saya lebih suka melakukan yang berikut:

Membuat otoritas sertifikat yang ditandatangani sendiri (CA)

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

(^ = memungkinkan baris perintah batch untuk membungkus baris)

Ini menciptakan sertifikat yang ditandatangani sendiri (-r), dengan kunci pribadi yang dapat diekspor (-pe). Ini bernama "CA saya", dan harus diletakkan di toko CA untuk pengguna saat ini. Kami menggunakan algoritma SHA-256 . Kuncinya dimaksudkan untuk penandatanganan (-sky).

Kunci pribadi harus disimpan dalam file MyCA.pvk, dan sertifikat dalam file MyCA.cer.

Mengimpor sertifikat CA

Karena tidak ada gunanya memiliki sertifikat CA jika Anda tidak mempercayainya, Anda harus mengimpornya ke toko sertifikat Windows. Anda dapat menggunakan snapin Sertifikat MMC, tetapi dari baris perintah:

certutil -user -addstore Root MyCA.cer

Membuat sertifikat penandatanganan kode (SPC)

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

Ini hampir sama seperti di atas, tetapi kami menyediakan kunci penerbit dan sertifikat (sakelar -ic dan -iv).

Kami juga ingin mengonversi sertifikat dan kunci menjadi file PFX:

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

Jika Anda ingin melindungi file PFX, tambahkan saklar -po, jika tidak PVK2PFX membuat file PFX tanpa frasa sandi.

Menggunakan sertifikat untuk menandatangani kode

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

( Lihat mengapa cap waktu mungkin penting )

Jika Anda mengimpor file PFX ke toko sertifikat (Anda dapat menggunakan PVKIMPRT atau snapin MMC), Anda dapat menandatangani kode sebagai berikut:

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

Beberapa kemungkinan stempel waktu URL signtool /tadalah:

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

Dokumentasi Microsoft lengkap

Unduhan

Bagi mereka yang bukan pengembang .NET, Anda akan memerlukan salinan kerangka kerja Windows SDK dan .NET. Tautan saat ini tersedia di sini: SDK & .NET (yang menginstal makecert C:\Program Files\Microsoft SDKs\Windows\v7.1). Jarak tempuh Anda mungkin beragam.

MakeCert tersedia dari Visual Studio Command Prompt. Visual Studio 2015 memilikinya, dan dapat diluncurkan dari Start Menu di Windows 7 di bawah "Prompt Perintah Pengembang untuk VS 2015" atau "VS2015 x64 Native Tools Command Prompt" (mungkin semuanya ada di folder yang sama).

Roger Lipscombe
sumber
Apakah ada cara untuk mengisi bidang alamat email sertifikat menggunakan metode ini? Exe klik kanan> properti> tanda tangan digital menunjukkan email sebagai "tidak tersedia" setelah masuk.
cronoklee
Jika Anda mendapatkan kesalahan "terlalu banyak parameter" maka Anda memeriksa Anda tidak mengedit salah satu tanda hubung secara tidak sengaja. Gagal itu - ketik ulang tanda hubung - jangan salin tempel.
fiat
8
@cronoklee Untuk mengisi bidang email sertifikat, cukup tambahkan E=your@email. Misalnya:makecert -pe -n "CN=My SPC,E=email@domain" ........
Rob W
1
Tidakkah Anda memerlukan flag kunci Extended Use -eku 1.3.6.1.5.5.7.3.3agar sertifikat dapat digunakan untuk penandatanganan kode (Saya tahu PowerShell gagal menandatangani skrip jika tidak ada)
Scott Chamberlain
1
@AdamPhelps, Windows tidak akan "belajar" untuk mempercayai sertifikat Anda. Pengguna Anda perlu menginstal sertifikat CA di toko Root. Ini, secara umum, adalah ide yang buruk (karena sertifikat CA root dapat digunakan untuk tujuan jahat). Ini bisa masuk akal dalam skenario perusahaan.
Roger Lipscombe
36

Seperti yang dinyatakan dalam jawaban, untuk menggunakan cara yang tidak usang untuk menandatangani skrip Anda sendiri, seseorang harus menggunakan New-SelfSignedCertificate .

  1. Hasilkan kunci:
New-SelfSignedCertificate -DnsName [email protected] -Type CodeSigning -CertStoreLocation cert:\CurrentUser\My
  1. Ekspor sertifikat tanpa kunci pribadi:
Export-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt

[0] akan berfungsi untuk kasus-kasus ketika Anda memiliki lebih dari satu sertifikat ... Jelas buat indeks cocok dengan sertifikat yang ingin Anda gunakan ... atau gunakan cara untuk menyaring (dengan thumprint atau penerbit).

  1. Impor sebagai Penerbit Tepercaya
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher
  1. Impor sebagai otoritas sertifikat Root.
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root
  1. Tanda tangani skrip (anggap di sini namanya script.ps1, perbaiki jalurnya).
Set-AuthenticodeSignature .\script.ps1 -Certificate (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)

Jelas sekali Anda telah mengatur kunci, Anda bisa langsung menandatangani skrip lain dengan itu.
Anda dapat memperoleh informasi lebih rinci dan bantuan pemecahan masalah di artikel ini .

chaami
sumber
Terima kasih untuk yang satu ini. Saya harus mulai dari jawaban bawah dulu!
mdiehl13
Terima kasih. Ini menyelesaikan semua masalah saya dalam mencoba agar proses 'yang tampaknya sederhana' ini berhasil.
Dave
1
Saya mendapat kesalahan pada "2." karena (get-ChildItem ...)mengembalikan lebih dari satu sertifikat, jadi saya menaruh "[0]" di ujungnya dan berhasil. Seperti diExport-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt
lundman
1
@Lara terima kasih atas umpan baliknya, saya telah menambahkan beberapa info kontekstual untuk membuatnya lebih mudah bahkan ketika mencoba kafein rendah ;-)
chaami
1
@Lara terima kasih karena memberi sinyal, saya tidak memperhatikan saat mengedit, Sepertinya StackOverflow sekarang lebih pilih-pilih tentang sintaks blok dan sekarang membutuhkan baris baru sebelum awal kode.
chaami
21

Jawaban Roger sangat membantu.

Saya mengalami sedikit kesulitan dalam menggunakannya, dan terus mendapatkan dialog kesalahan "Windows tidak dapat memverifikasi penerbit perangkat lunak driver ini". Kuncinya adalah dengan menginstal sertifikat root uji

certutil -addstore Root Demo_CA.cer

yang jawaban Roger tidak cukup jelas.

Berikut adalah file batch yang berfungsi untuk saya (dengan file .inf, tidak termasuk). Ini menunjukkan cara melakukan semuanya dari awal hingga selesai, tanpa alat GUI sama sekali (kecuali untuk beberapa kata sandi).

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
Dan Kegel
sumber
4
Jika Anda ingin menggunakan ini untuk menandatangani driver, Anda perlu mengimpor sertifikat CA ke toko mesin. Contoh saya mengimpornya ke toko pengguna, yang baik untuk sebagian besar perangkat lunak, untuk keperluan pengujian / internal.
Roger Lipscombe
20

Ini cukup mudah menggunakan perintah New-SelfSignedCertificate di Powershell. Buka PowerShell dan jalankan 3 perintah ini.

1) Buat sertifikat :
$ cert = Baru -SignSignedCertificate -DnsName www.yourwebsite.com -Type CodeSigning -CertStoreLocation Cert: \ CurrentUser \ My

2) atur kata sandinya :
$ CertPassword = ConvertTo-SecureString -String "my_passowrd" -Force –AsPlainText

3) Ekspor :
Ekspor-PfxCertificate -Cert "cert: \ CurrentUser \ My \ $ ($ cert.Thumbprint)" -FilePath "d: \ selfsigncert.pfx" -Password $ CertPassword

Sertifikat selfsigncert.pfx Anda akan berlokasi @D:/


Langkah opsional: Anda juga perlu menambahkan kata sandi sertifikat ke variabel lingkungan sistem. lakukan dengan memasukkan di bawah ini dalam cmd:setx CSC_KEY_PASSWORD "my_password"

JerryGoyal
sumber
JerryGoyal apakah Anda tahu cara mengubah sertifikat yang ditandatangani sendiri menjadi Sertifikat Tepercaya CA Root?
Tuan Heelis
12

Pada PowerShell 4.0 (Windows 8.1 / Server 2012 R2) dimungkinkan untuk membuat sertifikat di Windows tanpa makecert.exe .

Perintah yang Anda butuhkan adalah New-SelfSignedCertificate dan Export-PfxCertificate .

Instruksi ada di Membuat Sertifikat yang ditandatangani sendiri dengan PowerShell .

Yishai
sumber
3
Perlu disebutkan bahwa, bahkan jika Anda menginstal pembaruan WMF untuk mendapatkan PowerShell 4.0 di Windows 7, Anda tidak akan memiliki akses ke perintah ini. Tampaknya Win8 atau Server 2012 atau lebih baru.
Daniel Yankowsky