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:
- Get-AuthenticodeSignature .\app.exe
Dla nie podpisanej aplikacji powinniśmy dostać taką odpowiedź:
Teraz przejdźmy do wygenerowania certyfikatu:
- $cert = New-SelfSignedCertificate `
- -Type CodeSigningCert `
- -Subject "CN=Krzak Company, O=Krzak Company,
- L=Krakow, C=PL" `
- -CertStoreLocation "Cert:\CurrentUser\My" `
- -KeyAlgorithm RSA `
- -KeyLength 2048 `
- -HashAlgorithm SHA256 `
- -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:
- $cert = Get-ChildItem Cert:\CurrentUser\My | Where-Object {
- $_.Subject -like "*Krzak Company*"
- } | 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.
- Export-Certificate `
- -Cert $cert `
- -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.
- $cert = Get-ChildItem Cert:\CurrentUser\My | Where-Object {
- $_.Subject -like "*Krzak Company*"
- } | Select-Object -First 1
Ta komenda podpisuje cyfrowo:
- Set-AuthenticodeSignature `
- -FilePath ".\app.exe" `
- -Certificate $cert `
- -HashAlgorithm SHA256
- Get-AuthenticodeSignature ".\app.exe" | Format-List *
- SignerCertificate : [Subject]
- CN=Krzak Company, O=Krzak Company, L=Krakow, C=PL
- [Issuer]
- CN=Krzak Company, O=Krzak Company, L=Krakow, C=PL
- [Serial Number]
- 4F16A7412D7BD8A241ED2FF16DFF597D
- [Not Before]
- 11.09.2026 15:51:10
- [Not After]
- 11.09.2029 16:01:10
- [Thumbprint]
- 32762AD695ED0F1C81E5D3ED698E4563794853BA
- TimeStamperCertificate :
- Status : UnknownError
- StatusMessage : Łańcuch certyfikatów został przetworzony, ale operację przerwano na certyfikacie głównym, któr
- y nie należy do zaufanych dla dostawcy zaufania
- Path : C:\Users\w_klo\Desktop\Generowanie certyfikatu self sign\app.exe
- SignatureType : Authenticode
- IsOSBinary : False
Jak widać certyfikat nie jest zaufanym certyfikatem. Wobec tego musimy go dodać jako zaufanego:
- Import-Certificate `
- -FilePath ".\Krzak_Company_CodeSigning.cer" `
- -CertStoreLocation "Cert:\CurrentUser\Root"
Przy próbie eksportowania cerytifkatu wyświetli się okno:
Teraz do głównych wydawców:
- Import-Certificate `
- >> -FilePath ".\Krzak_Company_CodeSigning.cer" `
- >> -CertStoreLocation "Cert:\CurrentUser\TrustedPublisher"
- PSParentPath: Microsoft.PowerShell.Security\Certificate::CurrentUser\TrustedPublisher
- Thumbprint Subject
- ---------- -------
- 32762AD695ED0F1C81E5D3ED698E4563794853BA CN=Krzak Company, O=Krzak Company, L=Krakow, C=PL
Teraz ostatnia weryfikacja:
- Get-AuthenticodeSignature ".\app.exe" | Format-List Status, StatusMessage
- Status : Valid
- 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ć.