Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A CLI do winapp torna o desenvolvimento de Windows local simples: ele pode gerar um certificado de assinatura, confiar nele em seu computador e ativar o Modo de Desenvolvedor para você. Cada uma dessas etapas altera o estado do computador ou cria um arquivo que carrega uma chave privada, portanto, ajuda a saber exatamente o que eles fazem.
Esta página explica a consequência de cada comando, como desfazê-lo e o que fazer de forma diferente quando você envia. Os certificados de desenvolvimento e o Modo de Desenvolvedor são o caminho normal e compatível para testes locais . A meta aqui é que você entenda o que está aceitando, não que você os evite.
Certificados de desenvolvimento
Os pacotes MSIX devem ser assinados antes que Windows os instale. Para testes locais, winapp cert generate cria um certificado autoassinado para que você possa assinar e instalar seu próprio pacote sem comprar nada.
O que winapp cert generate cria
O certificado gerado é um certificado de assinatura de código autoassinado e de entidade final:
| Property | Value |
|---|---|
| Key | RSA 2048 bits, marcado como exportável |
| Algoritmo de assinatura | SHA-256 com RSA (PKCS nº 1 v1.5) |
| Uso de chave | Assinatura digital |
| Uso avançado de chave | Assinatura de código (1.3.6.1.5.5.7.3.3) |
| Restrições básicas | Não é uma autoridade de certificação |
| Validade | 365 dias por padrão (--valid-days) |
| Assunto | Deve corresponder ao Publisher no seu manifesto |
O comando grava duas coisas:
-
devcert.pfxno diretório atual (ou no caminho que você passa para--output). Esse arquivo contém o certificado e sua chave privada. - Uma cópia do certificado em seu repositório de certificados pessoal (
Cert:\CurrentUser\My).
Com --export-cer, ele também grava um .cer arquivo ao lado do .pfx. Esse arquivo contém apenas o certificado público , nenhuma chave privada , o que torna a coisa certa a ser entregue a um colega de equipe ou a um computador de teste que precisa confiar em seus builds.
Note
Um certificado autoassinado é confiável por ninguém até que alguém confie explicitamente nele. Serve para sua própria máquina e suas máquinas de teste; não substitui uma identidade real de assinatura de código ao distribuir seu aplicativo.
A senha padrão
winapp cert generate usa password como a senha PFX, a menos que você passe --password. O mesmo valor padrão se aplica quando você posteriormente fornece esse certificado para winapp sign, cuja opção de senha também é --password, e para winapp pack, que usa --cert-password.
Uma senha conhecida significa que a chave devcert.pfx privada está efetivamente desprotegida. Qualquer pessoa que obtém o arquivo pode assinar o código com ela. Essa é uma concessão aceitável para um certificado descartável que serve apenas para assinar compilações locais de teste em seu próprio computador, e é por isso que esse padrão existe.
Importante
Trate a senha padrão como um sinal de que o certificado é descartável. Se um certificado for usado para assinar algo que outra pessoa instalará, ele não deverá ser um winapp cert generate certificado com a senha padrão – consulte Assinatura para produção.
Scripts e agentes não precisam comparar a senha por conta própria: winapp cert generate --json relata "defaultPasswordIsPublic": true e repete a informação em um array warnings sempre que o padrão estiver em vigor. Veja gerar saída JSON de certificado.
Onde o arquivo de certificado reside
devcert.pfx é uma chave privada no disco. Duas regras mantêm isso fora de problemas:
Não confirme isso.winapp cert generate acrescenta automaticamente o nome do arquivo do certificado ao .gitignore lado dele, de modo que o fluxo padrão já está coberto. Se você mover o arquivo, renomeá-lo ou gerá-lo em um diretório gerenciado por outro .gitignore, verifique se a entrada o acompanhou:
git check-ignore -v devcert.pfx
Se isso não imprimir nada, o arquivo não será ignorado – adicione-o antes de confirmar.
Não empacote.winapp pack empacota tudo o que está no diretório de entrada; portanto, um devcert.pfx localizado na pasta de saída do seu aplicativo acaba ficando dentro do MSIX distribuído. Gere o certificado fora da pasta que você empacota, como mostra o guia Empacotando um EXE/CLI e confirme se ele está ausente antes de distribuir:
# 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
Gorjeta
Se um .pfx com uma chave privada real for incluído em um commit ou publicado, faça a rotação dele: gere um novo certificado, assine novamente e deixe de confiar no antigo usando as etapas em Remover um certificado confiável. Excluir o arquivo de uma confirmação posterior não o remove do histórico.
O que winapp cert install permite
winapp cert install adiciona o certificado ao repositório LocalMachine\TrustedPeople . Isso requer privilégios de administrador, pois altera a confiança de cada usuário no computador.
Quando um certificado estiver dentroTrustedPeople, Windows aceitará qualquer pacote MSIX assinado por esse certificado como confiável o suficiente para instalar, não apenas o pacote que você estava testando. Para um certificado cuja chave privada está em sua posse e que você mantém armazenada localmente, esse é exatamente o efeito pretendido. Esse também é o motivo para agir deliberadamente em relação a isso:
- Confie nos certificados gerados por você mesmo ou que venham de alguém que você deixaria instalar o software no computador.
- Não instale um certificado de desenvolvimento em computadores compartilhados, de produção ou de build dos quais outras pessoas dependem.
- Prefira distribuir a
.cer(somente a chave pública) em vez do.pfxquando um colega precisar instalar seu pacote de teste. Eles ganham a capacidade de confiar em seus builds sem obter a capacidade de assinar como você.
Para confiar em um .cer em outra máquina de teste, execute winapp cert install diretamente nela — o comando aceita tanto um .pfx quanto um .cer somente público:
# Run as Administrator
winapp cert install .\devcert.cer
O equivalente usando somente ferramentas internas de Windows é:
# Run as Administrator
Import-Certificate -FilePath .\devcert.cer -CertStoreLocation Cert:\LocalMachine\TrustedPeople
Removendo um certificado confiável
Os certificados de desenvolvimento expiram após um ano por padrão, mas a expiração não é remoção. Quando você não precisar mais de um certificado — o projeto terminou, a máquina está sendo reaproveitada ou a chave pode ter vazado — remova-o explicitamente.
Primeiro, localize sua impressão digital:
Get-ChildItem Cert:\LocalMachine\TrustedPeople |
Where-Object { $_.Subject -like '*CN=Contoso*' } |
Format-List Subject, Thumbprint, NotAfter
Em seguida, remova-o do repositório de confiança do computador. Esta etapa precisa de elevação:
# Run as Administrator. Replace with the thumbprint from the previous command.
$thumbprint = 'ABCD...'
Remove-Item -Path "Cert:\LocalMachine\TrustedPeople\$thumbprint"
cert generate também colocou o certificado, juntamente com sua chave privada, em seu repositório pessoal. Remova isso de um prompt normal, sem privilégios elevados, conectado com a conta que executou o cert generate:
$thumbprint = 'ABCD...'
Remove-Item -Path "Cert:\CurrentUser\My\$thumbprint"
Importante
Execute os dois comandos acima nos contextos mostrados. Se você elevou usando uma conta de administrador diferente, Cert:\CurrentUser nessa sessão elevada é o repositório desse administrador — não o seu — portanto, a chave privada ficaria no repositório do usuário que a gerou.
Por fim, exclua o .pfx e quaisquer cópias do .cer que você tenha distribuído, e cancele o registro dos pacotes que você instalou por fora (sideload) com ele:
winapp unregister
Note
A remoção do certificado não desinstala pacotes que já foram instalados com ele. Desinstale-os separadamente por meio de Configurações > Aplicativos > Aplicativos instalados ou com winapp unregister, para pacotes registrados no modo de desenvolvimento.
Modo de desenvolvedor
O Windows exige o Modo de Desenvolvedor para registrar um pacote de aplicativo diretamente de uma pasta no disco — um layout solto — em vez de instalar um MSIX compilado e assinado. Comandos como winapp run e create-debug-identity dependem disso e falham sem isso, e winapp init se oferece para ativá-lo para você.
O que muda ao ativá-lo
A interface de linha de comando (CLI) habilita o Modo de Desenvolvedor gravando dois valores DWORD sob HKEY_LOCAL_MACHINE:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock
AllowDevelopmentWithoutDevLicense = 1
AllowAllTrustedApps = 1
Como essas são configurações de todo o computador, a CLI inicia um processo auxiliar elevado e Windows mostra um prompt de Controle de Conta de Usuário. Nada será alterado se você recusar o prompt.
Na prática, isso significa que o computador:
- Registre pacotes de aplicativos diretamente de uma pasta no disco, sem que eles sejam empacotados em um MSIX ou sequer assinados (
AllowDevelopmentWithoutDevLicense). - Instale pacotes de aplicativos de fora do Microsoft Store desde que sejam assinados por um certificado em que o computador confia, incluindo qualquer certificado de desenvolvimento em
TrustedPeople(AllowAllTrustedApps).
Importante
O Modo de Desenvolvedor mais um certificado de desenvolvimento confiável é um afrouxamento deliberado das restrições de instalação padrão. Essa combinação pertence a computadores de desenvolvimento e teste. Deixe-o desativado em máquinas de produção, quiosques e infraestrutura compartilhada.
Controlando quando ele está habilitado
winapp init pergunta antes de alterar qualquer coisa e --use-defaults ignora totalmente a pergunta, deixando o Modo de Desenvolvedor intocado. Isso torna as execuções por script e de CI seguras por padrão:
winapp init --use-defaults
Se você preferir gerenciar a configuração por conta própria, habilite-a uma vez por meio do Modo de Desenvolvedor do Sistema > de Configurações > para desenvolvedores > e a CLI a detectará e seguirá em frente.
Desativação
Use o Sistema > de Configurações para desenvolvedores e desative >o Modo de Desenvolvedor. Esse é o caminho recomendado, pois as Configurações também limpam o estado do sistema operacional associado. Para confirmar o valor do Registro posteriormente:
Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock' `
-Name AllowDevelopmentWithoutDevLicense, AllowAllTrustedApps
Desativar o Modo de Desenvolvedor não remove certificados confiáveis ou pacotes já instalados. Confira Como remover um certificado confiável.
Assinatura para produção
Um certificado de desenvolvimento só funciona para pessoas que confiaram explicitamente nele. Para distribuir seu aplicativo, assine-o com uma identidade na qual o Windows já confia.
Escolher uma identidade de assinatura
Assinatura Confiável do Azure – um serviço de assinatura gerenciado pela nuvem. A chave privada nunca existe no computador de build, portanto, não há como
.pfxproteger, vazar ou girar manualmente. Usewinapp az-sign, que se autentica com a cadeia de credenciais Azure padrão e funciona com GitHub Actions OIDC ou uma identidade gerenciada.winapp az-sign .\MyApp.msixUm certificado de assinatura de código de uma autoridade certificadora confiável — passe-o para
winapp signcomo o segundo argumento posicional, com a senha em--password. Em seguida, você é responsável por armazenar o material da chave com segurança; mantenha-o em um token de hardware, em um cofre de chaves ou no repositório secreto do provedor de CI e nunca no repositório.O Microsoft Store – se você distribuir exclusivamente por meio da Loja, ele assinará o pacote para você e você não precisará assinar antes do envio.
Em todos os casos, o assunto do certificado deve corresponder ao valor Publisherno seu manifesto, inclusive para pacotes esparsos.
Manter os segredos de assinatura fora do repositório
As senhas de certificado pertencem ao repositório de segredos de CI, não em um arquivo de configuração. Leia-os do ambiente em vez de codificá-los:
winapp sign .\MyApp.msix $env:SIGNING_CERT_PATH --password $env:SIGNING_CERT_PASSWORD
O mesmo se aplica à configuração de build incluída no controle de código-fonte, como uma configuração do Electron Forge — consulte Empacotamento do Electron.
winapp az-sign evita totalmente o problema, porque não há senha para passar.
Antes de publicar
Uma breve lista de verificação para a transição do teste local para a distribuição:
- O pacote é assinado com um certificado emitido por uma Autoridade Certificadora (CA), com a Assinatura Confiável do Azure ou enviado para a Loja, não com
devcert.pfx. - Nenhum arquivo
.pfxou.cerestá dentro da saída do pacote. - Nenhuma senha de certificado aparece em arquivos confirmados, scripts de build ou logs de CI.
- O assunto do certificado corresponde ao manifesto
Publisher. - Os certificados de desenvolvimento e o Modo de Desenvolvedor não estão habilitados em computadores que só precisam executar o aplicativo.
Relatando um problema de segurança
Para relatar uma vulnerabilidade de segurança na própria CLI do winapp, siga o processo em SECURITY.md. Não abra uma issue pública no GitHub para relatar problemas de segurança.
Tópicos relacionados:
Windows developer