Pokyny k zabezpečení

CLI nástroj winapp usnadňuje místní vývoj pro Windows: dokáže vygenerovat podpisový certifikát, označit jej na vašem počítači jako důvěryhodný a automaticky zapnout režim pro vývojáře. Každý z těchto kroků změní stav počítače nebo vytvoří soubor s privátním klíčem, takže pomůže přesně zjistit, co dělají.

Tato stránka vysvětluje důsledky každého příkazu, jak ho vrátit zpět a co dělat jinak při odeslání. Vývojové certifikáty a vývojářský režim jsou normální a podporovaná cesta pro místní testování – cílem je pochopit, k čemu se přihlašujete, ne že se jim vyhnete.

Vývojové certifikáty

Balíčky MSIX musí být podepsané před Windows je nainstalují. Pro místní testování winapp cert generate vytvoří certifikát podepsaný sebou samým, takže můžete podepsat a nainstalovat vlastní balíček, aniž byste museli cokoli kupovat.

Co winapp cert generate vytvoří

Vygenerovaný certifikát je certifikát koncové entity pro podepisování kódu s vlastním podpisem:

Property Hodnota
Key 2048bitová verze RSA označená jako exportovatelná
Algoritmus podpisu SHA-256 s RSA (PKCS#1 v1.5)
Použití klíče Digitální podpis
Rozšířené použití klíče Podepisování kódu (1.3.6.1.5.5.7.3.3)
Základní omezení Nejedná se o certifikační autoritu
Platnost Ve výchozím nastavení je to 365 dnů (--valid-days)
Předmět Musí odpovídat Publisher ve vašem manifestu

Příkaz zapíše dvě věci:

  • devcert.pfx v aktuálním adresáři (nebo v cestě, kterou předáte parametru --output). Tento soubor obsahuje certifikát i jeho privátní klíč.
  • Kopie certifikátu v osobním úložišti certifikátů (Cert:\CurrentUser\My).

S --export-cer také zapíše soubor .cer vedle .pfx. Tento soubor obsahuje jenom veřejný certifikát – žádný soukromý klíč – takže je to správné předat týmu nebo testovacímu počítači, který potřebuje důvěřovat vašim buildům.

Note

Certifikátu s vlastním podpisem nikdo nedůvěřuje, dokud mu někdo výslovně nezačne důvěřovat. To je v pořádku pro váš vlastní počítač a vaše vlastní testovací počítače; při distribuci aplikace to ale nenahrazuje skutečnou identitu pro podepisování kódu.

Výchozí heslo

winapp cert generate používá password jako heslo k souboru PFX, pokud nezadáte --password. Stejné výchozí nastavení platí i tehdy, když tento certifikát později předáte nástroji winapp sign, jehož volba hesla je také --password, a nástroji winapp pack, který používá --cert-password.

Dobře známé heslo znamená, že privátní klíč devcert.pfx je efektivně nechráněný – každý, kdo soubor získá, může s ním podepsat kód. To je přijatelný kompromis u dočasného certifikátu, který se používá pouze k podepisování místních testovacích sestavení na vašem vlastním počítači, a proto existuje toto výchozí nastavení.

Important

Zacházejte s výchozím heslem jako se signálem, že certifikát je uvolnitelný. Pokud se certifikát někdy používá k podepsání něčeho, co nainstaluje jiná osoba, neměl by to být winapp cert generate certifikát s výchozím heslem – viz Podepisování pro produkční prostředí.

Skripty a agenti nemusí porovnávat samotné heslo: winapp cert generate --json hlásí "defaultPasswordIsPublic": true a opakuje zveřejnění v warnings poli pokaždé, když je výchozí hodnota platná. Viz cert generate JSON output.

Kde se nachází soubor certifikátu

devcert.pfx je privátní klíč na disku. Dvě pravidla ho chrání před problémy:

Necommitujte ho.winapp cert generate automaticky přidá název souboru certifikátu k .gitignore vedle něj, takže výchozí postup je už tímto pokrytý. Pokud soubor přesunete, přejmenujete ho nebo vygenerujete do adresáře spravovaného jiným .gitignoreadresářem, zkontrolujte, jestli položka následovala:

git check-ignore -v devcert.pfx

Pokud se nic nevypíše, soubor není ignorován — přidejte ho, než provedete commit.

Nebalte ho.winapp pack zabalí vše ve vstupním adresáři, takže se devcert.pfx nacházející se ve výstupní složce vaší aplikace dostane do distribuovaného balíčku MSIX. Vygenerujte certifikát mimo složku, kterou zabalíte, jak ukazuje průvodce balením EXE/CLI , a před distribucí ověřte, že chybí:

# Unpack the package and check that no certificate is inside
winapp tool makeappx unpack /p .\MyApp.msix /d .\inspect /o
Get-ChildItem .\inspect -Recurse -Include *.pfx, *.cer

Tip

Pokud se někdy do commitu uloží nebo zveřejní .pfx se skutečným soukromým klíčem, obměňte jej: vygenerujte nový certifikát, znovu jej podepište a podle kroků v části Odebrání důvěryhodného certifikátu přestaňte důvěřovat starému. Odstranění souboru z pozdějšího commitu ho neodstraní z historie.

Co winapp cert install uděluje

winapp cert install přidá certifikát do LocalMachine\TrustedPeople úložiště. To vyžaduje oprávnění správce, protože mění důvěryhodnost každého uživatele na počítači.

Jakmile je certifikát v TrustedPeoplesouboru , Windows přijme všechny balíčky MSIX podepsané tímto certifikátem jako důvěryhodné pro instalaci – nejen balíček, který jste testovali. U certifikátu, u něhož vlastníte soukromý klíč a uchováváte ho lokálně, je to přesně zamýšlený výsledek. Je to také důvod, proč o tom uvažovat:

  • Důvěřovat certifikátům, které jste vygenerovali sami nebo které pocházejí od někoho, koho byste nechali nainstalovat software na počítač.
  • Neinstalujte vývojový certifikát na sdílené, produkční ani sestavovací počítače, na které spoléhají ostatní lidé.
  • Raději sdílejte .cer (pouze veřejný klíč) spíše než .pfx, když kolega potřebuje nainstalovat váš testovací balíček. Získají schopnost důvěřovat vašim buildům, aniž by získali možnost podepsat se jako vy.

Chcete-li na jiném testovacím počítači důvěřovat .cer, spusťte na něm přímo winapp cert install — příkaz přijímá buď .pfx, nebo pouze veřejný .cer:

# Run as Administrator
winapp cert install .\devcert.cer

Ekvivalentem použití pouze integrovaných nástrojů Windows je:

# Run as Administrator
Import-Certificate -FilePath .\devcert.cer -CertStoreLocation Cert:\LocalMachine\TrustedPeople

Odebrání důvěryhodného certifikátu

Vývojovým certifikátům standardně po jednom roce vyprší platnost, ale vypršení platnosti neznamená jejich odstranění. Jakmile už certifikát nepotřebujete — projekt skončil, zařízení se bude používat k jinému účelu nebo mohlo dojít k úniku klíče — výslovně jej odstraňte.

Nejprve vyhledejte jeho kryptografický otisk:

Get-ChildItem Cert:\LocalMachine\TrustedPeople |
    Where-Object { $_.Subject -like '*CN=Contoso*' } |
    Format-List Subject, Thumbprint, NotAfter

Poté jej odeberte z úložiště důvěryhodných certifikátů počítače. Tento krok vyžaduje zvýšení oprávnění:

# Run as Administrator. Replace with the thumbprint from the previous command.
$thumbprint = 'ABCD...'
Remove-Item -Path "Cert:\LocalMachine\TrustedPeople\$thumbprint"

cert generate také umístil certifikát spolu s odpovídajícím soukromým klíčem do vašeho osobního úložiště. Odeberte ho z normální výzvy bez zvýšených oprávnění přihlášených jako účet, který běžel cert generate:

$thumbprint = 'ABCD...'
Remove-Item -Path "Cert:\CurrentUser\My\$thumbprint"

Important

Ve zobrazených kontextech spusťte výše uvedené dva příkazy. Pokud jste provedli elevaci pomocí jiného účtu správce, Cert:\CurrentUser v této relaci se zvýšenými oprávněními je úložiště tohoto správce — nikoli vaše — takže by soukromý klíč zůstal v úložišti uživatele, který ho vygeneroval.

Nakonec odstraňte .pfx a všechny kopie .cer, které jste rozdali, a zrušte registraci balíčků, které jste s ním nainstalovali bokem:

winapp unregister

Note

Odebráním certifikátu se neodinstalují balíčky, které už s ním byly nainstalované. Odinstalujte je samostatně v nabídce Nastavení > Aplikace > Nainstalované aplikace nebo pomocí winapp unregister pro balíčky registrované ve vývojovém režimu.

Vývojářský režim

Windows vyžaduje režim pro vývojáře, aby bylo možné zaregistrovat balíček aplikace přímo ze složky na disku – volné uspořádání – namísto instalace sestaveného a podepsaného balíčku MSIX. Příkazy jako winapp run a create-debug-identity na tom závisejí a bez toho selžou, přičemž winapp init nabízí, že to za vás zapne.

Co se změní po jeho povolení

CLI zapne režim pro vývojáře zápisem dvou hodnot DWORD pod HKEY_LOCAL_MACHINE:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock
    AllowDevelopmentWithoutDevLicense = 1
    AllowAllTrustedApps               = 1

Protože se jedná o nastavení pro celý počítač, CLI spustí pomocný proces se zvýšenými oprávněními a Windows zobrazí výzvu Řízení uživatelských účtů. Pokud výzvu odmítnete, nic se nezmění.

Prakticky to znamená, že stroj bude:

  • Zaregistrujte balíčky aplikací přímo ze složky na disku, aniž byste je museli zabudovat do MSIX nebo vůbec podepsat (AllowDevelopmentWithoutDevLicense).
  • Nainstalujte balíčky aplikací mimo Microsoft Store, pokud jsou podepsané certifikátem důvěryhodnosti počítače , včetně jakéhokoli vývojového certifikátu v TrustedPeople (AllowAllTrustedApps).

Important

Vývojářský režim a důvěryhodný vývojový certifikát je záměrné uvolnění výchozích omezení instalace. Tato kombinace patří do vývojových a testovacích počítačů. Nechte to vypnuté na produkčních strojích, kioscích a sdílené infrastruktuře.

Nastavení, kdy je povoleno

winapp init se zeptá před změnou čehokoli a --use-defaults zcela přeskočí otázku a ponechá vývojářský režim nedotčený. Díky tomu jsou skriptované skripty a CI ve výchozím nastavení bezpečné:

winapp init --use-defaults

Pokud byste chtěli toto nastavení raději spravovat sami, povolte ho jednou prostřednictvím systému > nastavení > pro vývojáře > a rozhraní příkazového řádku ho zjistí a přejde dál.

Vypnutí

Použijte systém > nastavení > pro vývojáře a vypněte režim vývojáře. Toto je doporučená cesta, protože nastavení také vyčistí přidružený stav operačního systému. Pokud si chcete hodnotu registru ověřit později:

Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock' `
    -Name AllowDevelopmentWithoutDevLicense, AllowAllTrustedApps

Vypnutím vývojářského režimu neodeberete důvěryhodné certifikáty nebo už nainstalované balíčky – viz Odebrání důvěryhodného certifikátu.

Podepisování pro produkci

Vývojový certifikát funguje pouze pro lidi, kteří mu výslovně důvěřují. Pokud chcete aplikaci distribuovat, podepište ji identitou, které systém Windows již důvěřuje.

Volba podpisové identity

  • Důvěryhodné podepisování Azure – podpisová služba spravovaná v cloudu. Privátní klíč na vašem sestavovacím stroji nikdy neexistuje, takže není žádný .pfx, který by bylo nutné chránit, který by mohl uniknout nebo který by bylo nutné ručně obměňovat. Použijte winapp az-sign, který se ověřuje pomocí standardního řetězce přihlašovacích údajů Azure a pracuje s GitHub Actions OIDC nebo spravovanou identitou.

    winapp az-sign .\MyApp.msix
    
  • Certifikát pro podepisování kódu od důvěryhodné certifikační autority – předejte jej do winapp sign jako druhý poziční argument a jeho heslo zadejte do --password. Pak jste zodpovědní za bezpečné uložení klíče; uchovávejte ho v hardwarovém tokenu, trezoru klíčů nebo úložišti tajných kódů poskytovatele CI a nikdy v úložišti.

  • Microsoft Store – pokud distribuujete výhradně prostřednictvím Storu, podepíše vám balíček a před odesláním ho nemusíte podepisovat.

V každém případě musí subjekt certifikátu odpovídat hodnotě v manifestu Publisher , včetně pro řídké balíčky.

Uchovávejte tajné klíče pro podepisování mimo úložiště.

Hesla certifikátů patří do úložiště tajných kódů CI, ne do konfiguračního souboru. Přečtěte si je z prostředí místo jejich pevného kódování:

winapp sign .\MyApp.msix $env:SIGNING_CERT_PATH --password $env:SIGNING_CERT_PASSWORD

Totéž platí pro konfiguraci sestavení uloženou ve správě verzí, například konfiguraci Electron Forge — viz Balení aplikace Electron. winapp az-sign zabraňuje problému zcela, protože neexistuje žádné heslo k předání.

Před publikováním

Krátký kontrolní seznam pro přechod z místního testování na distribuci:

  • Balíček je podepsaný certifikátem vydaným certifikační autoritou, Důvěryhodné podepisování Azure nebo odeslán do Storu , nikoli pomocí devcert.pfx.
  • Uvnitř zabaleného výstupu není žádný .pfx soubor nebo .cer soubor.
  • V potvrzených souborech, skriptech sestavení nebo protokolech CI se nezobrazuje žádné heslo certifikátu.
  • Předmět certifikátu odpovídá manifestu Publisher.
  • Vývojové certifikáty a režim vývojáře nejsou povolené na počítačích, na kterých je potřeba aplikaci pouze spustit.

Hlášení problému se zabezpečením

Pokud chcete nahlásit ohrožení zabezpečení v samotném rozhraní příkazového řádku winapp, postupujte podle postupu v SECURITY.md. Nevytvářejte prosím veřejný issue na GitHubu pro hlášení bezpečnostních problémů.