Skip to content

Instantly share code, notes, and snippets.

@LucasHayashi
Created September 28, 2025 14:46
Show Gist options
  • Select an option

  • Save LucasHayashi/42f193660da7db5db47b87ffb67b0eda to your computer and use it in GitHub Desktop.

Select an option

Save LucasHayashi/42f193660da7db5db47b87ffb67b0eda to your computer and use it in GitHub Desktop.
Nginx no Windows — Passo a passo (SSL local com OpenSSL)

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).


Pré-requisitos

  • Nginx instalado (ex.: C:\nginx-1.29.1) e nginx.exe no 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).

Passo 1 — Criar pasta para os certificados

mkdir C:\cert

Passo 2 — Criar arquivo de configuração do OpenSSL (com SAN) e gerar o certificado

No 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 EXT

Observações:

  • CN = localhost e SAN com DNS:localhost e IP:127.0.0.1 garantem que o navegador aceite o certificado para https://localhost e https://127.0.0.1 (desde que você o importe como confiável).
  • -nodes gera a chave sem senha (útil para dev).

Passo 3 — Importar o certificado como confiável no Windows

Você pode importar no store do Usuário Atual ou no Computador Local.

Via GUI (exemplo que você usou)

  1. Win + R → digite certmgr.msc (store do usuário) ou certlm.msc (store do computador - requer admin).
  2. Navegue até Autoridades de Certificação Raiz ConfiáveisCertificados.
  3. Clique com o botão direito → Todas as TarefasImportar....
  4. Selecione C:\cert\localhost.crt e conclua.
  5. Reinicie o navegador (ou, em alguns casos, faça logoff/login).

Dica: para que todos os usuários da máquina confiem, use certlm.msc e importe no store do Computer account.


Passo 4 — Configurar o nginx.conf (exemplo mínimo com HTTPS)

(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; }
    }
}

Passo 5 — Testar e recarregar o Nginx

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

Observações finais / Dicas

  • 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 -ano e encerre ou mude a porta.

Referência rápida de comandos (resumo)

  • 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 stop ou taskkill /F /IM nginx.exe
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment