niedziela, 13 września 2026

Generowanie certyfikatów do podpisania aplikacji

W tym poście chciałbym opisać sposób generowania certyfikatów dla aplikacji oraz w jaki sposób podpisać aplikację z poziomu konsoli w Windows.


Jak już mamy jakąś aplikację przygotowaną. Wygenerowaliśmy do niej plik *.exe to można sprawdzić jej podpis cyfrowy. Na Windows do tego celu wykorzystamy PowerShell z prawem administratora:

  1. Get-AuthenticodeSignature .\app.exe

Dla nie podpisanej aplikacji powinniśmy dostać taką odpowiedź:


Teraz przejdźmy do wygenerowania certyfikatu:

  1. $cert = New-SelfSignedCertificate `
  2. -Type CodeSigningCert `
  3. -Subject "CN=Krzak Company, O=Krzak Company,
  4. L=Krakow, C=PL" `
  5. -CertStoreLocation "Cert:\CurrentUser\My" `
  6. -KeyAlgorithm RSA `
  7. -KeyLength 2048 `
  8. -HashAlgorithm SHA256 `
  9. -NotAfter (Get-Date).AddYears(3)

W argumentach podajemy typ certyfikatu, nazwę, lokalizację, algorytm klucza publicznego/prywatnego, długość klucza, algorytm skrót oraz okres ważności certyfikatu. 

Teraz wyszukujemy certyfikat:

  1. $cert = Get-ChildItem Cert:\CurrentUser\My | Where-Object {
  2. $_.Subject -like "*Krzak Company*"
  3. } | Select-Object -First 1

Sprawdzamy czy coś się pojawi komendą $cert:

Można dodać certyfikat do pliku. Tak by ktoś komu damy tą aplikację mógł zainstalować certyfikat na swoim komputerze.

  1. Export-Certificate `
  2.     -Cert $cert `
  3.     -FilePath "C:\...\Desktop\Generowanie certyfikatu self sign\Krzak_Company_CodeSigning.cer"

Po wygenerowaniu wygląda tak:


Teraz podpisanie:

Najpierw wyszukanie certyfikatu w magazynie i zapisanie go do zmiennej $cert.

  1. $cert = Get-ChildItem Cert:\CurrentUser\My | Where-Object {
  2.     $_.Subject -like "*Krzak Company*"
  3. } | Select-Object -First 1

Ta komenda podpisuje cyfrowo:

  1. Set-AuthenticodeSignature `
  2.     -FilePath ".\app.exe" `
  3.     -Certificate $cert `
  4.     -HashAlgorithm SHA256


Wyświetla się UNKNOWN ERROR. Sprawdźmy najpierw powód wywoływania błędu:

  1. Get-AuthenticodeSignature ".\app.exe" | Format-List *
  2.  
  3.  
  4. SignerCertificate      : [Subject]
  5.                            CN=Krzak Company, O=Krzak Company, L=Krakow, C=PL
  6.  
  7.                          [Issuer]
  8.                            CN=Krzak Company, O=Krzak Company, L=Krakow, C=PL
  9.  
  10.                          [Serial Number]
  11.                            4F16A7412D7BD8A241ED2FF16DFF597D
  12.  
  13.                          [Not Before]
  14.                            11.09.2026 15:51:10
  15.  
  16.                          [Not After]
  17.                            11.09.2029 16:01:10
  18.  
  19.                          [Thumbprint]
  20.                            32762AD695ED0F1C81E5D3ED698E4563794853BA
  21.  
  22. TimeStamperCertificate :
  23. Status                 : UnknownError
  24. StatusMessage          : Łańcuch certyfikatów został przetworzony, ale operację przerwano na certyfikacie głównym, któr
  25.                          y nie należy do zaufanych dla dostawcy zaufania
  26. Path                   : C:\Users\w_klo\Desktop\Generowanie certyfikatu self sign\app.exe
  27. SignatureType          : Authenticode
  28. IsOSBinary             : False

Jak widać certyfikat nie jest zaufanym certyfikatem. Wobec tego musimy go dodać jako zaufanego:

  1. Import-Certificate `
  2.     -FilePath ".\Krzak_Company_CodeSigning.cer" `
  3.     -CertStoreLocation "Cert:\CurrentUser\Root"

Przy próbie eksportowania cerytifkatu wyświetli się okno:


Teraz do głównych wydawców:

  1. Import-Certificate `
  2. >>     -FilePath ".\Krzak_Company_CodeSigning.cer" `
  3. >>     -CertStoreLocation "Cert:\CurrentUser\TrustedPublisher"
  4.  
  5.  
  6.    PSParentPath: Microsoft.PowerShell.Security\Certificate::CurrentUser\TrustedPublisher
  7.  
  8. Thumbprint                                Subject
  9. ----------                                -------
  10. 32762AD695ED0F1C81E5D3ED698E4563794853BA  CN=Krzak Company, O=Krzak Company, L=Krakow, C=PL

Teraz ostatnia weryfikacja:

  1. Get-AuthenticodeSignature ".\app.exe" | Format-List Status, StatusMessage
  2.  
  3.  
  4. Status        : Valid
  5. StatusMessage : Signature verified.

Należy pamiętać, że certyfikat self-signed nie będzie automatycznie zaufany na innych komputerach. Aby podpis był traktowany jako zaufany, certyfikat musi być zainstalowany na komputerze odbiorcy. W przypadku publicznie dystrybuowanych aplikacji standardowym rozwiązaniem jest certyfikat Code Signing wystawiony przez zaufane CA. Ale za to trzeba odpowiednio zapłacić.