Toolkit self-hosted para gestão, inspeção, conversão, validação e exportação de certificados. https://tools.ruiguimaraes.net/certforgerg/
  • Python 55.7%
  • JavaScript 19.2%
  • HTML 13.4%
  • CSS 10.3%
  • Dockerfile 1.4%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-08-09 18:42:26 +01:00
backend Rename project to CertForgeRG 2026-08-09 14:11:29 +01:00
frontend Show remaining session time 2026-08-09 18:42:26 +01:00
.dockerignore Initial cert-toolbox application 2026-08-09 02:40:47 +01:00
.env.example feat(change): updated .env.example 2026-08-09 15:59:08 +01:00
.gitignore Initial cert-toolbox application 2026-08-09 02:40:47 +01:00
docker-compose.yml Rename project to CertForgeRG 2026-08-09 14:11:29 +01:00
Dockerfile Rename project to CertForgeRG 2026-08-09 14:11:29 +01:00
README.md feat(change): updated README.md 2026-08-09 14:49:58 +01:00

CertForgeRG

Aplicação web self-hosted em Docker para administração, inspeção e conversão segura de certificados.

O nome do produto/interface, repositório, container e directório de instalação é CertForgeRG.

O objetivo é substituir conversores online e pequenos comandos manuais repetitivos por uma workstation local baseada em FastAPI + OpenSSL, sem persistência por defeito.

Funcionalidades

Área Suporte
Importação .crt, .cer, .pem, .key, .pfx, .p12, .der, .p7b, .p7c, .csr
Inspeção CN, Subject, Issuer, SAN, validade, algoritmo, tamanho da chave, fingerprint SHA-256
Conversão CRT/CER/PEM para PEM/DER, P7B para PEM
CSR Gerar nova private key e CSR para renovação de certificados
PKCS#12 Separar PFX/P12 em certificado, chave privada e chain; criar PFX com cert + key + chain
Validação Verificar se a private key corresponde ao certificado
Exportação IIS, Nginx, Apache, HAProxy, pfSense, fullchain
Segurança operacional Sessões temporárias, limpeza automática, sem volume persistente por defeito
Interface Marca CertForgeRG, logotipo próprio no cabeçalho e footer © 2026 ruiguimaraes.net

Arranque rápido

cd D:\Git\it-tools\certforgerg
docker compose up -d --build

Aceder a:

http://localhost:8087

Verificar estado:

docker compose ps
docker compose logs -f certforgerg

Nota sobre portas:

Contexto Porta
Acesso pelo host/rede 8087
Porta interna do container 8080
Healthcheck Docker 8080

No docker-compose.yml, isto fica como 8087:8080. A healthcheck deve continuar a usar 127.0.0.1:8080, porque é executada dentro do container.

Parar:

docker compose down

Segurança

Por defeito, a aplicação:

  • não usa base de dados;
  • não monta volumes persistentes;
  • guarda uploads apenas em /tmp/certforgerg;
  • usa tmpfs no Docker Compose;
  • apaga sessões expiradas automaticamente;
  • corre como utilizador não-root;
  • usa filesystem read-only;
  • remove Linux capabilities;
  • ativa no-new-privileges;
  • limita extensões de upload;
  • limita tamanho de upload.

Limitações importantes:

  • A aplicação não substitui uma PKI, HSM, cofre de segredos ou sistema formal de gestão de certificados.
  • Passwords de PFX/P12 são enviadas para o backend para executar OpenSSL; usa sempre HTTPS se publicares atrás de reverse proxy.
  • Certificados e private keys carregados ficam temporariamente disponíveis dentro da sessão até expirar o TTL.

Variáveis de ambiente

Variável Valor por defeito Descrição
CERTFORGERG_MAX_UPLOAD_SIZE_MB 25 Tamanho máximo por ficheiro
CERTFORGERG_SESSION_TTL_SECONDS 1800 Tempo de vida de uma sessão temporária
CERTFORGERG_CLEANUP_INTERVAL_SECONDS 300 Intervalo de limpeza automática
CERTFORGERG_TEMP_ROOT /tmp/certforgerg Diretório temporário
CERTFORGERG_OPENSSL_BIN openssl Binário OpenSSL

Utilização da interface

A interface está dividida em três áreas principais:

Área Função
Ficheiros Upload temporário dos certificados, chaves, PFX/P12, P7B e CSR
Inspeção Visualização de metadados e resumo OpenSSL do ficheiro selecionado
Operações Conversões, validações e exportações para perfis de servidores

1. Criar sessão de trabalho

Ao abrir a aplicação é criada automaticamente uma sessão temporária.

No canto superior direito aparece o estado:

Sessão temporária ativa (30 min)

Para limpar o trabalho atual e começar de novo:

  1. Clicar em Nova sessão.
  2. Fazer novo upload dos ficheiros necessários.

Notas:

  • os ficheiros da sessão anterior deixam de estar disponíveis na interface;
  • os ficheiros são removidos automaticamente quando o TTL expira;
  • por defeito não existe persistência em disco fora do tmpfs do container.

2. Fazer upload de ficheiros

Na área Ficheiros:

  1. Arrastar os ficheiros para a zona Arrastar ficheiros ou selecionar.
  2. Em alternativa, clicar nessa zona e escolher os ficheiros manualmente.
  3. Confirmar que os ficheiros aparecem na lista lateral.

Extensões suportadas:

Tipo Extensões
Certificados .crt, .cer, .pem, .der
Chaves privadas .key, .pem
PKCS#12 .pfx, .p12
PKCS#7 .p7b, .p7c
CSR .csr

3. Inspecionar certificados, PFX/P12, chaves e CSR

Na lista de ficheiros:

  1. Clicar em Inspecionar no ficheiro pretendido.
  2. Se for um .pfx ou .p12 protegido, preencher primeiro Password PFX/P12 se aplicável.
  3. Analisar os cartões de metadados e o resumo OpenSSL abaixo.

Para certificados X.509, a interface mostra:

Campo Descrição
CN Common Name do certificado
Issuer Entidade emissora
Subject Subject completo
Validade início Data/hora de início de validade
Validade fim Data/hora de expiração
Algoritmo assinatura Algoritmo de assinatura do certificado
Chave pública Tipo e tamanho da chave pública
Fingerprint SHA-256 Impressão digital SHA-256
SAN Subject Alternative Names
Key Usage Utilizações permitidas da chave
Extended Key Usage Usos estendidos, como TLS Web Server Authentication

Para .pfx/.p12, a aplicação extrai o certificado cliente do contentor PKCS#12 e apresenta os mesmos metadados X.509, mantendo também o resumo do contentor.

4. Área Operações

A área Operações está dividida em quatro secções. Cada secção mostra apenas os campos e botões que fazem sentido para esse fluxo.

Secção Objectivo Botões
Renovação / CSR Criar uma nova private key e um CSR para renovação Gerar CSR
Validação Confirmar que certificado e private key correspondem Validar chave-certificado
Conversão / Extração Separar PFX/P12 ou converter ficheiros de origem Separar PFX, Converter para PEM, Converter para DER, P7B para PEM
Exportação / Deployment Gerar artefactos finais para servidores e appliances Juntar em PFX, Gerar fullchain, Exportar IIS, Exportar Nginx, Exportar Apache, Exportar HAProxy, Exportar pfSense

O botão Atualizar recarrega a lista de ficheiros da sessão. Usa-o se acabaste de gerar um output e queres garantir que os menus têm a lista actualizada.

5. Renovação / CSR

Usa esta secção quando um certificado está a expirar e precisas de enviar um CSR a uma entidade certificadora ou a outra equipa.

Campo Obrigatório Descrição
Common Name Sim Nome principal do certificado, normalmente o FQDN principal
SAN DNS Não Lista de nomes DNS separados por vírgula, ponto e vírgula ou nova linha
SAN IP Não Lista de IPs separados por vírgula, ponto e vírgula ou nova linha
Organização Não Nome legal ou interno da organização
Unidade Não Departamento/unidade, por exemplo IT
País Não Código ISO de duas letras, por exemplo PT
Localidade Não Cidade/localidade
Distrito/Estado Não Distrito, estado ou região
Chave Sim Tipo e tamanho da nova chave privada

Notas importantes:

  • se Common Name for um nome DNS e não estiver em SAN DNS, a aplicação adiciona-o automaticamente ao SAN;
  • a aplicação gera sempre uma private key nova juntamente com o CSR;
  • envia apenas request.csr para a entidade certificadora;
  • guarda private.key em local seguro, porque será necessária para instalar o certificado emitido;
  • não reutilizes a private key antiga se a política de segurança do cliente exigir rotação de chave.

6. Validação

Usa esta secção antes de exportar ou instalar certificados.

Campo Obrigatório Descrição
Certificado Sim Certificado leaf/server certificate
Private key Sim Chave privada a validar

7. Conversão / Extração

Usa esta secção quando a operação parte de um ficheiro único.

Campo Obrigatório Descrição
Origem Sim Ficheiro a separar ou converter, por exemplo .pfx, .p12, .der, .p7b
Password origem Não Password do ficheiro de origem, normalmente PFX/P12

8. Exportação / Deployment

Usa esta secção para gerar os ficheiros finais a instalar em serviços.

Campo Obrigatório Descrição
Certificado Sim Certificado leaf/server certificate
Private key Conforme operação Obrigatória para PFX, IIS, HAProxy e pfSense
Chain / CA bundle Não Cadeia intermédia/CA bundle
Password PFX destino Conforme operação Recomendado para PFX/IIS

Operações suportadas pelos botões

Gerar CSR

Usar quando um certificado vai expirar e precisas de gerar um novo pedido de assinatura para renovação.

Preencher:

Campo Obrigatório Exemplo
Common Name Sim www.example.pt
SAN DNS Não www.example.pt, example.pt
SAN IP Não x.x.x.x
Organização Não Empresa Lda
Unidade Não IT
País Não PT
Localidade Não Lisboa
Distrito/Estado Não Lisboa
Chave Sim RSA 4096

Depois clicar:

Gerar CSR

Resultado: .zip com:

  • private.key;
  • request.csr.

Fluxo recomendado:

  1. Gerar o CSR.
  2. Descarregar o ZIP.
  3. Guardar private.key em local seguro.
  4. Enviar apenas request.csr à entidade certificadora.
  5. Quando receberes o novo certificado, voltar ao CertForgeRG.
  6. Fazer upload do certificado emitido, da private.key guardada e da chain.
  7. Usar Validar chave-certificado.
  8. Exportar para IIS/Nginx/Apache/HAProxy/pfSense conforme o destino.

Juntar em PFX

Usar quando tens certificado, private key e opcionalmente chain, e queres gerar um .pfx/.p12.

Preencher:

Campo Obrigatório Notas
Certificado Sim Certificado leaf
Private key Sim Chave privada correspondente
Chain / CA bundle Não Recomendado quando existe cadeia intermédia
Password PFX destino Não Recomendado para transporte/instalação

Depois clicar:

Juntar em PFX

Resultado:

certificate.pfx

Separar PFX

Usar quando recebeste um .pfx/.p12 e precisas de separar certificado, private key e chain para Linux.

Preencher:

  • .pfx ou .p12 em Origem;
  • password em Password origem, se aplicável;

Depois clicar:

Separar PFX

Resultado: .zip com:

  • certificate.crt;
  • private.key;
  • chain.crt.

Converter para PEM

Usar para converter certificados suportados para PEM.

Preencher:

Campo Obrigatório Notas
Origem Sim Certificado de origem

Depois clicar:

Converter para PEM

Resultado:

certificate.pem

Converter para DER

Usar para gerar certificado em DER/binário.

Preencher:

Campo Obrigatório Notas
Origem Sim Certificado de origem

Depois clicar:

Converter para DER

Resultado:

certificate.der

P7B para PEM

Usar quando a entidade emissora entrega a cadeia em .p7b/.p7c.

Preencher:

Campo Obrigatório Notas
Origem Sim Ficheiro .p7b ou .p7c

Depois clicar:

P7B para PEM

Resultado:

chain.pem

Gerar fullchain

Usar para gerar um fullchain.pem para serviços Linux que esperam certificado + cadeia.

Preencher:

  • certificado em Certificado;
  • CA bundle em Chain / CA bundle;

Depois clicar:

Gerar fullchain

Resultado: fullchain.pem.

Exportar IIS

Usar quando vais instalar o certificado em IIS/Windows.

Preencher:

Campo Obrigatório Notas
Certificado Sim Certificado leaf
Private key Sim Chave privada correspondente
Chain / CA bundle Não Recomendado quando existe cadeia intermédia
Password PFX destino Sim IIS normalmente exige PFX protegido

Depois clicar:

Exportar IIS

Resultado:

iis-certificate.pfx

Exportar Nginx

Usar quando vais instalar em Nginx.

Preencher:

Campo Obrigatório Notas
Certificado Sim Certificado leaf
Chain / CA bundle Não Recomendado para gerar fullchain

Depois clicar:

Exportar Nginx

Resultado:

nginx-fullchain.pem

Resultado esperado:

ssl_certificate     /etc/nginx/certs/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/private.key;

A ferramenta gera o ficheiro PEM de certificado + chain. A private key deve ser instalada separadamente.

Exportar Apache

Usar quando vais instalar em Apache HTTP Server.

Preencher:

Campo Obrigatório Notas
Certificado Sim Certificado leaf
Chain / CA bundle Não Recomendado para gerar fullchain

Depois clicar:

Exportar Apache

Resultado:

apache-fullchain.pem

Resultado esperado:

SSLCertificateFile /etc/apache2/ssl/fullchain.pem
SSLCertificateKeyFile /etc/apache2/ssl/private.key

Exportar HAProxy

Usar quando o HAProxy espera um PEM combinado.

O HAProxy normalmente espera um PEM combinado:

certificate
chain
private key

Preencher:

Campo Obrigatório Notas
Certificado Sim Certificado leaf
Private key Sim Chave privada correspondente
Chain / CA bundle Não Recomendado

Depois clicar:

Exportar HAProxy

Resultado:

haproxy.pem

Exportar pfSense

Usar para gerar um PEM combinado quando o workflow de importação do pfSense o exigir.

Preencher:

Campo Obrigatório Notas
Certificado Sim Certificado leaf
Private key Sim Chave privada correspondente
Chain / CA bundle Não Recomendado

Depois clicar:

Exportar pfSense

Resultado:

pfsense.pem

Dependendo do workflow, o pfSense pode importar certificado e chave separadamente, ou um PEM combinado. Esta aplicação gera um PEM combinado quando forneces certificado, chain e chave.

Validar chave-certificado

Usar para confirmar que uma private key corresponde ao certificado selecionado.

Preencher:

Campo Obrigatório Notas
Certificado Sim Certificado leaf
Private key Sim Chave privada a validar

Depois clicar:

Validar chave-certificado

Resultados possíveis:

Resultado Significado
A chave privada corresponde ao certificado. O par está correcto
A chave privada nao corresponde ao certificado. O certificado e a chave não pertencem ao mesmo par

Fluxos práticos

De PFX de cliente para Nginx/Apache

  1. Upload do .pfx.
  2. Preencher Password origem, se existir.
  3. Selecionar o .pfx em Origem.
  4. Clicar em Separar PFX.
  5. Descarregar o ZIP.
  6. Voltar a carregar certificate.crt, private.key e chain.crt, se necessário.
  7. Selecionar certificate.crt em Certificado.
  8. Selecionar chain.crt em Chain / CA bundle.
  9. Clicar em Gerar fullchain, Exportar Nginx ou Exportar Apache.

De CRT/KEY/CHAIN para IIS

  1. Upload de certificate.crt, private.key e chain.crt.
  2. Selecionar certificate.crt em Certificado.
  3. Selecionar private.key em Private key.
  4. Selecionar chain.crt em Chain / CA bundle.
  5. Definir Password PFX destino.
  6. Clicar em Exportar IIS.
  7. Descarregar iis-certificate.pfx.

Validar entrega de entidade certificadora

  1. Upload do certificado recebido.
  2. Upload da private key correspondente.
  3. Clicar em Inspecionar no certificado para confirmar CN, SAN e validade.
  4. Selecionar o certificado em Certificado.
  5. Selecionar a chave em Private key.
  6. Clicar em Validar chave-certificado.

Converter cadeia P7B para PEM

  1. Upload do ficheiro .p7b/.p7c.
  2. Selecionar esse ficheiro em Origem.
  3. Clicar em P7B para PEM.
  4. Usar o chain.pem resultante em Chain / CA bundle.

Renovar certificado expirado com CSR

  1. Abrir uma nova sessão.
  2. Preencher Common Name com o FQDN principal do certificado.
  3. Preencher SAN DNS com todos os nomes que devem constar no certificado.
  4. Escolher o tipo de chave, normalmente RSA 4096.
  5. Clicar em Gerar CSR.
  6. Descarregar csr-request.zip.
  7. Guardar private.key em local seguro e restrito.
  8. Enviar request.csr para a entidade certificadora.
  9. Quando receberes o certificado emitido, fazer upload do certificado e da private key guardada.
  10. Clicar em Validar chave-certificado.
  11. Exportar no formato necessário para o serviço final.

Reverse proxy recomendado

Para uso interno, coloca a aplicação atrás de HTTPS com autenticação no reverse proxy. Exemplo conceptual:

Camada Recomendação
TLS Certificado interno ou público no reverse proxy
Autenticação Authelia, Authentik, Keycloak, Cloudflare Access ou equivalente
Rede Apenas VLAN/admin network
Logs Não registar passwords, conteúdos de certificados ou chaves
Backups Não aplicável por defeito, porque não há persistência

Apache em subpath

Exemplo para publicar a aplicação num subpath:

https://example.domain.com/certforgerg/

Quando o Apache está no mesmo servidor do container:

RedirectMatch 301 ^/certforgerg$ /certforgerg/

ProxyPass        /certforgerg/ http://127.0.0.1:8087/ retry=0
ProxyPassReverse /certforgerg/ http://127.0.0.1:8087/

Quando o Apache está noutro servidor:

RedirectMatch 301 ^/certforgerg$ /certforgerg/

ProxyPass        /certforgerg/ http://192.168.0.10:8087/ retry=0
ProxyPassReverse /certforgerg/ http://192.168.0.10:8087/

As regras específicas de /certforgerg/ devem ficar antes do ProxyPass / do site principal.

Se o vhost tiver regras WebSocket genéricas para o site principal, excluir o subpath da aplicação:

RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteCond %{REQUEST_URI} !^/certforgerg/ [NC]
RewriteRule /(.*) ws://127.0.0.1:8181/$1 [P,L]

O backend continua a escutar na porta interna 8080 dentro do container; 8087 é apenas a porta publicada no host.

Roadmap técnico

  • Suporte a certificados ECC em validação chave-certificado com testes adicionais.
  • Geração de chaves RSA/ECDSA pela interface.
  • Validação completa da cadeia de confiança com CA bundle.
  • Exportação estruturada em ZIP por perfil.
  • Modo opcional com autenticação local.