Este Gist reúne os passos que você seguiu: gerar certificado com SAN no PowerShell, importar no Windows como confiável e configurar/recarregar o Nginx. Testado com Nginx 1.29 (Windows).
- Nginx instalado (ex.:
C:\nginx-1.29.1) enginx.exeno PATH ou use o caminho absoluto. - OpenSSL disponível no PATH.
- PowerShell (executar como Administrador quando for escrever em
C:\ou importar certificados no store do computador).
mkdir C:\certNo PowerShell, crie um arquivo .cnf e gere o certificado autoassinado com SAN (localhost e 127.0.0.1):
$config = @"
[ req ]
default_bits = 2048
distinguished_name = dn
x509_extensions = EXT
prompt = no
[ dn ]
CN = localhost
[ EXT ]
subjectAltName = @alt_names
keyUsage = digitalSignature
extendedKeyUsage = serverAuth
[ alt_names ]
DNS.1 = localhost
IP.1 = 127.0.0.1
"@
$config | Out-File -FilePath C:\cert\localhost.cnf -Encoding ascii -Force
# Gera o par chave+certificado (válido por 365 dias)
openssl req -x509 -out C:\cert\localhost.crt -keyout C:\cert\localhost.key `
-newkey rsa:2048 -nodes -sha256 `
-days 365 `
-config C:\cert\localhost.cnf -extensions EXTObservações:
CN = localhoste SAN comDNS:localhosteIP:127.0.0.1garantem que o navegador aceite o certificado parahttps://localhostehttps://127.0.0.1(desde que você o importe como confiável).-nodesgera a chave sem senha (útil para dev).
Você pode importar no store do Usuário Atual ou no Computador Local.
Win + R→ digitecertmgr.msc(store do usuário) oucertlm.msc(store do computador - requer admin).- Navegue até Autoridades de Certificação Raiz Confiáveis → Certificados.
- Clique com o botão direito → Todas as Tarefas → Importar....
- Selecione
C:\cert\localhost.crte conclua. - Reinicie o navegador (ou, em alguns casos, faça logoff/login).
Dica: para que todos os usuários da máquina confiem, use
certlm.msce importe no store do Computer account.
(Use barras normais / nos caminhos no Windows — o Nginx aceita esse formato.)
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# BLOCO HTTP (opcional) — redireciona para HTTPS
server {
listen 80;
server_name localhost;
return 301 https://$host$request_uri;
}
# BLOCO HTTPS
server {
listen 443 ssl;
http2 on; # comente se der problema
server_name localhost;
ssl_certificate C:/cert/localhost.crt;
ssl_certificate_key C:/cert/localhost.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html { root html; }
}
}Sempre valide a configuração antes de recarregar:
# Testa sintaxe e arquivos referenciados
nginx -t
# Se estiver rodando e quiser recarregar as configurações
nginx -s reload
# Se preferir reiniciar do zero
nginx -s quit
nginx
# Se o processo não encerrar, force kill
taskkill /F /IM nginx.exe- Navegadores vão avisar por padrão que certificados autoassinados não são confiáveis — importar para o store como raiz confiável remove o aviso localmente.
- Para produção, use CA pública (Let's Encrypt, etc.).
- Se o
http2 on;causar erro, comente essa linha e recompile/atualize conforme necessário — em builds Windows antigos às vezes causa problema. - Se a porta 443 estiver ocupada por outro serviço (IIS, Skype etc.), Nginx não vai subir — descubra o PID com
netstat -anoe encerre ou mude a porta.
- Gerar cert:
openssl req -x509 -out C:\cert\localhost.crt -keyout C:\cert\localhost.key -newkey rsa:2048 -nodes -sha256 -days 365 -config C:\cert\localhost.cnf -extensions EXT - Testar nginx:
nginx -t - Recarregar:
nginx -s reload - Parar gracioso:
nginx -s quit - Parar forçado:
nginx -s stopoutaskkill /F /IM nginx.exe