Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
A linha de comando winapp torna o desenvolvimento local para Windows simples: pode gerar um certificado de assinatura, confiar nele na sua máquina e ativar o Modo Desenvolvedor por si. Cada um desses passos altera o estado da máquina ou cria um ficheiro que transporta uma chave privada, por isso ajuda saber exatamente o que fazem.
Esta página explica a consequência de cada comando, como o desfazer e o que fazer de diferente quando se envia. Os certificados de desenvolvimento e o Modo Desenvolvedor são o caminho normal e suportado para testes locais — o objetivo aqui é que compreenda no que está a aderir, não que os evite.
Certificados de desenvolvimento
Os pacotes MSIX devem ser assinados antes de o Windows os instalar. Para testes locais, winapp cert generate cria um certificado auto-assinado para que possa assinar e instalar o seu próprio pacote sem comprar nada.
O que winapp cert generate cria
O certificado gerado é um certificado autoassinado de entidade final para assinatura de código:
| Property | Value |
|---|---|
| Key | RSA 2048 bits, marcado como exportável |
| Algoritmo de assinatura | SHA-256 com RSA (PKCS#1 v1.5) |
| Utilização da chave | Assinatura digital |
| Utilização melhorada de chaves | Assinatura de código (1.3.6.1.5.5.7.3.3) |
| Restrições básicas | Não é uma autoridade certificadora |
| Validade | 365 dias por predefinição (--valid-days) |
| Assunto | Deve corresponder com o Publisher no seu manifesto |
O comando escreve duas coisas:
-
devcert.pfxno diretório atual (ou no caminho que passa a--output). Este ficheiro contém tanto o certificado como a sua chave privada. - Uma cópia do certificado na sua loja de certificados pessoais (
Cert:\CurrentUser\My).
Com --export-cer, também escreve um .cer ficheiro ao lado do .pfx. Esse ficheiro contém apenas o certificado público — sem chave privada — o que o torna o correto a entregar a um colega de equipa ou a uma máquina de testes que precisa de confiar nas tuas builds.
Note
Um certificado auto-assinado não é confiável para ninguém até que alguém confie explicitamente nele. É adequado para a sua própria máquina e para as suas próprias máquinas de teste; não substitui uma identidade real para assinatura de código quando distribui a sua aplicação.
A palavra-passe padrão
winapp cert generate usa password como palavra-passe do PFX, a menos que passe --password. O mesmo padrão aplica-se quando mais tarde fornece esse certificado a winapp sign, cuja opção de palavra-passe é também --password, e para winapp pack, que assume --cert-password.
Uma palavra-passe bem conhecida significa que a chave privada em devcert.pfx está, na prática, desprotegida — qualquer pessoa que obtenha o ficheiro pode assinar código com ela. Esse é um compromisso aceitável para um certificado descartável, utilizado apenas para assinar compilações de teste locais na sua própria máquina, e é por isso que essa predefinição existe.
Importante
Trate a palavra-passe padrão como um sinal de que o certificado é descartável. Se algum certificado for usado para assinar algo que outra pessoa vai instalar, não deve ser um winapp cert generate certificado com a palavra-passe padrão — ver Assinatura para produção.
Scripts e agentes não têm de comparar eles próprios a palavra-passe: winapp cert generate --json indicam "defaultPasswordIsPublic": true e repetem essa indicação numa matriz warnings sempre que a predefinição estiver ativa. Consulte cert generate JSON output.
Onde se encontra o ficheiro do certificado
devcert.pfx é uma chave privada no disco. Duas regras mantêm-no fora de problemas:
Não o comprometas.winapp cert generate Adiciona automaticamente o nome do ficheiro do certificado ao .gitignore seguinte, por isso o fluxo padrão já está coberto. Se mover o ficheiro, renomeá-lo ou gerá-lo num diretório gerido por outro .gitignore, verifique se a entrada o seguiu:
git check-ignore -v devcert.pfx
Se isso não imprimir nada, o ficheiro não é ignorado — adicione-o antes de se comprometer.
Não o incluas no pacote.winapp pack inclui tudo no diretório de entrada, por isso, um devcert.pfx que esteja na pasta de saída da tua aplicação acaba dentro do MSIX distribuído. Gere o certificado fora da pasta que vai empacotar, como mostra o guia Packaging an EXE/CLI, e confirme que este está ausente antes de o 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
Sugestão
Se algum dia um .pfx certificado com chave privada real for confirmado ou publicado, roda-o: gera um novo certificado, re-assina e deixa de confiar no antigo usando os passos para remover um certificado de confiança. Eliminar o ficheiro de um commit posterior não o remove do histórico.
O que winapp cert install concede
winapp cert install adiciona o certificado ao arquivo LocalMachine\TrustedPeople. Isto requer privilégios de administrador, porque altera a confiança de todos os utilizadores na máquina.
Uma vez que um certificado está inseridoTrustedPeople, o Windows aceitará qualquer pacote MSIX assinado por esse certificado como suficientemente confiável para ser instalado — não apenas o pacote que estava a testar. Para um certificado cuja chave privada detém e guarda localmente, esse é precisamente o efeito pretendido. É também a razão para agir deliberadamente quanto a isso:
- Certificados de confiança que geraste tu próprio, ou que vêm de alguém que deixarias instalar software na máquina.
- Não instale um certificado de desenvolvimento em máquinas partilhadas, de produção ou de construção em que outras pessoas dependam.
- Prefira distribuir apenas a
.cerem vez da.pfxquando um colega precisar de instalar o seu pacote de teste. Eles ganham a capacidade de confiar nas tuas builds sem terem a capacidade de assinar como tu.
Para confiar num .cer em outra máquina de teste, execute winapp cert install diretamente nessa máquina — o comando aceita um .pfx ou um .cer apenas público:
# Run as Administrator
winapp cert install .\devcert.cer
O equivalente, usando apenas ferramentas do Windows integradas, é:
# Run as Administrator
Import-Certificate -FilePath .\devcert.cer -CertStoreLocation Cert:\LocalMachine\TrustedPeople
Remoção de um certificado de confiança
Os certificados de desenvolvimento expiram ao fim de um ano por predefinição, mas a expiração não significa a remoção. Quando já não precisar de um certificado — o projeto terminou, a máquina está a ser reutilizada ou a chave pode ter sido comprometida — remova-o de forma explícita.
Primeiro, encontre a sua impressão digital:
Get-ChildItem Cert:\LocalMachine\TrustedPeople |
Where-Object { $_.Subject -like '*CN=Contoso*' } |
Format-List Subject, Thumbprint, NotAfter
Depois remove-o da loja de confiança das máquinas. Este degrau 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 Coloque também o certificado, juntamente com a sua chave privada, na sua loja pessoal. Remova isso de uma linha de comandos normal, sem elevação, com sessão iniciada na conta que executou cert generate:
$thumbprint = 'ABCD...'
Remove-Item -Path "Cert:\CurrentUser\My\$thumbprint"
Importante
Execute os dois comandos acima nos contextos apresentados. Se elevou usando uma conta de administrador diferente, Cert:\CurrentUser nessa sessão elevada está a loja desse administrador — não a sua — por isso a chave privada ficaria para trás na loja do utilizador gerador.
Por fim, elimina o .pfx e quaisquer cópias .cer que tenhas distribuído, e desregista os pacotes que instalaste manualmente com ele:
winapp unregister
Note
Remover o certificado não desinstala pacotes que já estavam instalados com ele. Desinstale-as separadamente em Definições > Aplicações > Aplicações instaladas ou com winapp unregister para pacotes registados em modo de desenvolvimento.
Modo Desenvolvedor
O Windows exige que o Modo Desenvolvedor registre um pacote de aplicação diretamente a partir 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 oferece ativá-lo por si.
O que muda ao ativá-la
A CLI ativa o Modo Desenvolvedor escrevendo dois DWORD valores em HKEY_LOCAL_MACHINE:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock
AllowDevelopmentWithoutDevLicense = 1
AllowAllTrustedApps = 1
Como estas são definições para toda a máquina, a CLI inicia um processo auxiliar elevado e o Windows mostra um aviso de Controlo de Conta de Utilizador. Nada é alterado se rejeitares a solicitação.
Na prática, isto significa que a máquina irá:
- Registar pacotes de aplicações diretamente de uma pasta no disco, sem serem empacotados num MSIX nem assinados de todo (
AllowDevelopmentWithoutDevLicense). - Instale pacotes de aplicações fora da Microsoft Store, desde que estejam assinados por um certificado em que a máquina confie — incluindo qualquer certificado de desenvolvimento em
TrustedPeople(AllowAllTrustedApps).
Importante
O Modo Desenvolvedor mais um certificado de desenvolvimento confiável é um afrouxamento deliberado das restrições de instalação padrão. Essa combinação deve estar em máquinas de desenvolvimento e de teste. Deixe-o desligado em máquinas de produção, quiosques e infraestruturas partilhadas.
Controlar quando está ativado
winapp init pergunta antes de mudar qualquer coisa, e --use-defaults ignora completamente a pergunta, deixando o Modo Desenvolvedor inalterado. Isso torna seguras por defeito as execuções em script e de CI:
winapp init --use-defaults
Se preferires gerir a definição tu mesmo, ativa-a uma vez através do Modo Desenvolvedor do Sistema > de Definições > Para Desenvolvedores > e a CLI irá detetá-la e seguir em frente.
Desligar
Use o Sistema > de Definições > para programadores e desligue o Modo Desenvolvedor. Este é o caminho recomendado, porque as Definições também limpam o estado associado ao sistema operativo. Para confirmar o valor do registo depois:
Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock' `
-Name AllowDevelopmentWithoutDevLicense, AllowAllTrustedApps
Desligar o Modo Desenvolvedor não remove certificados de confiança nem pacotes já instalados — ver Remoção de um certificado de confiança.
Assinatura para produção
Um certificado de desenvolvimento só funciona para pessoas que confiaram explicitamente nele. Para distribuir a sua aplicação, assine-a com uma identidade em que o Windows já confie.
Escolha uma identidade de assinatura
Assinatura Confiável do Azure — um serviço de assinatura gerido na cloud. A chave privada nunca existe na sua máquina de compilação, pelo que não existe
.pfxpara proteger, divulgar ou efetuar manualmente a sua rotação. Usewinapp az-sign, que autentica com a cadeia de credenciais padrão do Azure e funciona com GitHub Actions OIDC ou uma identidade gerida.winapp az-sign .\MyApp.msixUm certificado de assinatura de código de uma autoridade certificadora de confiança — passe-o a
winapp signcomo o segundo argumento posicional, com a sua palavra-passe em--password. Passa então a ser responsável por armazenar o material criptográfico da chave em segurança; guarde-o num token de hardware, num cofre de chaves ou no arquivo de segredos do seu fornecedor de CI, e nunca no repositório.A Loja Microsoft — se distribuir exclusivamente através da Loja, esta assina-lhe o pacote e não precisa de o assinar antes da submissão.
Em todos os casos, o titular do certificado deve corresponder ao valor Publisher no seu manifesto, incluindo nos pacotes esparsos.
Mantenha os segredos de assinatura fora do repositório
As palavras-passe dos certificados pertencem ao teu armazenamento secreto CI, não a um ficheiro de configuração. Leia-as do ambiente em vez de as codificar fixamente:
winapp sign .\MyApp.msix $env:SIGNING_CERT_PATH --password $env:SIGNING_CERT_PASSWORD
O mesmo se aplica à configuração de compilação registada no controlo de código-fonte, como uma configuração do Electron Forge — ver empacotamento do Electron.
winapp az-sign Evita o problema por completo, porque não há palavra-passe para passar.
Antes de publicares
Uma breve lista de verificação para a transição dos testes locais para a distribuição:
- O pacote é assinado com um certificado emitido pela CA, Assinatura Confiável do Azure, ou submetido à Store — não com
devcert.pfx. - Nenhum ficheiro
.pfxou.cerse encontra na saída do pacote. - Não aparece nenhuma palavra-passe de certificado em ficheiros comprometidos, scripts de compilação ou registos CI.
- O tema do certificado corresponde ao manifesto
Publisher. - Os certificados de desenvolvimento e o Modo Desenvolvedor não estão ativados em máquinas que só precisam de executar a aplicação.
Reportar um problema de segurança
Para reportar uma vulnerabilidade de segurança na própria linha de comando winapp, siga o processo em SECURITY.md. Por favor, não abra um problema público no GitHub para relatórios de segurança.
Tópicos relacionados
Windows developer