- Python 55.7%
- JavaScript 19.2%
- HTML 13.4%
- CSS 10.3%
- Dockerfile 1.4%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| backend | ||
| frontend | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| docker-compose.yml | ||
| Dockerfile | ||
| README.md | ||
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
tmpfsno 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:
- Clicar em
Nova sessão. - 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
tmpfsdo container.
2. Fazer upload de ficheiros
Na área Ficheiros:
- Arrastar os ficheiros para a zona
Arrastar ficheiros ou selecionar. - Em alternativa, clicar nessa zona e escolher os ficheiros manualmente.
- 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:
- Clicar em
Inspecionarno ficheiro pretendido. - Se for um
.pfxou.p12protegido, preencher primeiroPassword PFX/P12 se aplicável. - 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 Namefor um nome DNS e não estiver emSAN 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.csrpara a entidade certificadora; - guarda
private.keyem 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:
- Gerar o CSR.
- Descarregar o ZIP.
- Guardar
private.keyem local seguro. - Enviar apenas
request.csrà entidade certificadora. - Quando receberes o novo certificado, voltar ao CertForgeRG.
- Fazer upload do certificado emitido, da
private.keyguardada e da chain. - Usar
Validar chave-certificado. - 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:
.pfxou.p12emOrigem;- 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
- Upload do
.pfx. - Preencher
Password origem, se existir. - Selecionar o
.pfxemOrigem. - Clicar em
Separar PFX. - Descarregar o ZIP.
- Voltar a carregar
certificate.crt,private.keyechain.crt, se necessário. - Selecionar
certificate.crtemCertificado. - Selecionar
chain.crtemChain / CA bundle. - Clicar em
Gerar fullchain,Exportar NginxouExportar Apache.
De CRT/KEY/CHAIN para IIS
- Upload de
certificate.crt,private.keyechain.crt. - Selecionar
certificate.crtemCertificado. - Selecionar
private.keyemPrivate key. - Selecionar
chain.crtemChain / CA bundle. - Definir
Password PFX destino. - Clicar em
Exportar IIS. - Descarregar
iis-certificate.pfx.
Validar entrega de entidade certificadora
- Upload do certificado recebido.
- Upload da private key correspondente.
- Clicar em
Inspecionarno certificado para confirmar CN, SAN e validade. - Selecionar o certificado em
Certificado. - Selecionar a chave em
Private key. - Clicar em
Validar chave-certificado.
Converter cadeia P7B para PEM
- Upload do ficheiro
.p7b/.p7c. - Selecionar esse ficheiro em
Origem. - Clicar em
P7B para PEM. - Usar o
chain.pemresultante emChain / CA bundle.
Renovar certificado expirado com CSR
- Abrir uma nova sessão.
- Preencher
Common Namecom o FQDN principal do certificado. - Preencher
SAN DNScom todos os nomes que devem constar no certificado. - Escolher o tipo de chave, normalmente
RSA 4096. - Clicar em
Gerar CSR. - Descarregar
csr-request.zip. - Guardar
private.keyem local seguro e restrito. - Enviar
request.csrpara a entidade certificadora. - Quando receberes o certificado emitido, fazer upload do certificado e da private key guardada.
- Clicar em
Validar chave-certificado. - 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.