Centralized Digital Certificate Inventory for Corporate Environments
O CertInventory é uma plataforma leve para coleta, centralização, consulta e auditoria de certificados digitais instalados em computadores corporativos.
Desenvolvido com Python, FastAPI e SQLite, o sistema foi projetado para ambientes de TI que precisam de uma visão centralizada dos certificados utilizados por usuários e estações de trabalho Windows.
A coleta pode ser realizada por scripts PowerShell distribuídos através de ferramentas como Active Directory / Group Policy, enquanto o CertInventory centraliza os dados recebidos em uma interface web protegida.
Em ambientes corporativos, certificados digitais podem estar distribuídos por centenas de computadores e diferentes perfis de usuário. Sem uma solução centralizada, identificar:
- onde um certificado está instalado;
- qual usuário está utilizando determinado certificado;
- quando um certificado irá expirar;
- quais computadores possuem o mesmo certificado;
- quais certificados já estão vencidos;
pode exigir verificações manuais e pouco escaláveis.
O CertInventory busca resolver esse problema centralizando essas informações em uma única aplicação.
┌──────────────────────────┐
│ Windows Endpoint │
│ │
│ PowerShell │
│ certutil / Certificate │
│ Store │
└────────────┬─────────────┘
│
│ HTTPS
│ API Key
▼
┌──────────────────────────┐
│ CertInventory │
│ │
│ FastAPI │
│ REST API + Web │
└────────────┬─────────────┘
│
▼
┌──────────────────────────┐
│ SQLite │
│ │
│ WAL enabled │
└────────────┬─────────────┘
│
▼
┌──────────────────────────┐
│ Dashboard │
│ │
│ Login JWT • Filters │
│ Reports • Audit │
└──────────────────────────┘
Recebe informações de certificados coletadas remotamente em computadores Windows através de scripts PowerShell.
A interface web (Dashboard) é protegida por formulário de login utilizando JWT (JSON Web Tokens) e cookies HTTP-only, garantindo que somente usuários autenticados possam acessar os dados corporativos.
Os endpoints responsáveis pelo recebimento dos dados coletados pelos scripts são protegidos através de API Key, configurada por variável de ambiente.
A chave é enviada através do cabeçalho:
X-API-Key: SUA_API_KEYPermite combinar diferentes critérios para localizar certificados específicos:
-
Empresa
-
Computador
-
Usuário
-
Status
- Válido
- Vencido
- Próximo do vencimento
-
Número de série
Certificados com o mesmo número de série são automaticamente identificados e agrupados.
Por exemplo, um mesmo certificado de e-CNPJ instalado em cinco computadores diferentes poderá ser identificado como uma única entidade, permitindo visualizar sua distribuição no ambiente:
Certificado: ACME LTDA
Serial: 123456789ABC
├── PC-FINANCEIRO-01
│ └── usuario01
│
├── PC-FINANCEIRO-02
│ └── usuario02
│
├── PC-DIRETORIA-01
│ └── usuario03
│
├── PC-CONTABILIDADE-01
│ └── usuario04
│
└── PC-CONTABILIDADE-02
└── usuario05
Os dados filtrados podem ser exportados diretamente pelo Dashboard para:
- Excel
- Impressão
Os filtros aplicados na interface são considerados durante a geração dos relatórios.
O projeto possui uma imagem Docker publicada no Docker Hub, permitindo realizar o deploy sem a necessidade de baixar ou compilar o código-fonte no servidor de produção.
| Componente | Tecnologia |
|---|---|
| Backend | Python 3.13 |
| API | FastAPI |
| ASGI Server | Uvicorn |
| ORM | SQLAlchemy |
| Database | SQLite (WAL) |
| Frontend | HTML5 / JavaScript |
| UI Framework | Bootstrap 5 |
| Data Grid | DataTables |
| Testes | Pytest / HTTPX |
| Segurança | PyJWT |
| Containers | Docker / Docker Compose |
O CertInventory utiliza variáveis de ambiente para armazenar credenciais e chaves criptográficas.
Crie um arquivo .env na raiz do projeto ou na mesma pasta do docker-compose.yml em produção.
# Chave de autorização utilizada pelos scripts PowerShell
API_KEY=CHANGE_ME_TO_A_STRONG_RANDOM_KEY
# Credenciais de acesso ao Dashboard
ADMIN_USER=admin
ADMIN_PASS=CHANGE_ME_TO_A_STRONG_PASSWORD
# Chave criptográfica utilizada para assinatura dos tokens JWT
SECRET_KEY=CHANGE_ME_TO_A_LONG_RANDOM_STRINGImportante: o arquivo
.envcontém informações sensíveis e não deve ser versionado no Git.
Adicione ao .gitignore:
.env
venv/
__pycache__/
*.pyc
data/Para gerar uma chave aleatória utilizando Python:
python -c "import secrets; print(secrets.token_urlsafe(32))"O comando pode ser utilizado para gerar tanto a API_KEY quanto a SECRET_KEY.
Exemplo:
API_KEY=7nX...chave-gerada...
SECRET_KEY=K8s...chave-gerada...O método recomendado para ambientes de produção é utilizar a imagem oficial publicada no Docker Hub.
Dessa forma, o servidor não precisa possuir o código-fonte nem instalar as dependências Python localmente.
Crie uma pasta para o projeto:
mkdir certinventory
cd certinventoryCrie o arquivo:
nano .envAdicione as variáveis:
API_KEY=CHANGE_ME_TO_A_STRONG_RANDOM_KEY
ADMIN_USER=admin
ADMIN_PASS=CHANGE_ME_TO_A_STRONG_PASSWORD
SECRET_KEY=CHANGE_ME_TO_A_LONG_RANDOM_STRINGCrie o arquivo:
nano docker-compose.ymlUtilize:
services:
web:
image: yodao/certinventory:latest
container_name: certinventory_api
ports:
- "5000:5000"
env_file:
- .env
environment:
TZ: America/Sao_Paulo
volumes:
- ./data:/app/data
restart: unless-stoppedO volume:
- ./data:/app/datagarante que o banco de dados seja armazenado no servidor host e não dentro do container.
Assim, a atualização ou recriação do container não deverá remover os dados armazenados no banco.
Execute:
docker compose up -dO Docker fará o download da imagem e iniciará o container automaticamente.
Verifique o status:
docker compose psAcompanhe os logs:
docker compose logs -fA aplicação estará disponível em:
http://SERVER_IP:5000
Exemplo:
http://192.168.1.100:5000
Quando uma nova versão da imagem estiver disponível no Docker Hub:
docker compose pullDepois:
docker compose up -dPara acompanhar a inicialização:
docker compose logs -fComo o banco de dados está armazenado no volume:
./data
os dados existentes permanecem separados da imagem do container.
docker compose psdocker compose logs -fdocker compose restartdocker compose downdocker compose up -ddocker compose pull
docker compose up -dA instalação local é destinada principalmente ao desenvolvimento e manutenção do projeto.
git clone https://github.com/VilanovaPassos/certinventory.git
cd certinventorypython -m venv venvAtive o ambiente:
venv\Scripts\activatepython3 -m venv venv
source venv/bin/activatepip install -r requirements.txtCrie:
.env
Exemplo:
API_KEY=CHANGE_ME_TO_A_STRONG_RANDOM_KEY
ADMIN_USER=admin
ADMIN_PASS=CHANGE_ME_TO_A_STRONG_PASSWORD
SECRET_KEY=CHANGE_ME_TO_A_LONG_RANDOM_STRINGuvicorn app:app --host 0.0.0.0 --port 5000 --reloadA aplicação estará disponível em:
http://localhost:5000
A documentação automática da API pode ser acessada em:
http://localhost:5000/docs
O parâmetro
--reloadé recomendado somente para desenvolvimento.
O projeto possui um script para geração de dados sintéticos.
Ele permite testar o Dashboard sem a necessidade de utilizar certificados reais ou realizar a coleta em computadores da rede.
Execute:
python popular_banco.pyO script limpará o banco atual e criará aproximadamente:
5 Empresas
100 Computadores
100 Usuários
1000 Certificados
Os certificados são distribuídos a partir de um pool de certificados, simulando situações em que o mesmo certificado está instalado em várias máquinas.
O conjunto de dados também contempla diferentes estados:
- certificados válidos;
- certificados vencidos;
- certificados próximos do vencimento;
- certificados distribuídos entre diferentes computadores;
- certificados associados a diferentes usuários.
Atenção: o script de povoamento limpa os dados existentes. Utilize-o somente em ambientes de desenvolvimento ou teste.
A coleta dos certificados é realizada através de um script PowerShell.
Em ambientes Active Directory, o script pode ser distribuído utilizando:
- Group Policy;
- tarefas agendadas;
- scripts de logon;
- ferramentas de gerenciamento de endpoints.
Também é possível utilizar Item-Level Targeting para determinar quais computadores pertencem a determinada empresa ou grupo.
O comando nativo utilizado como base para a coleta é:
certutil -user -store MyOutra alternativa utilizando o Certificate Provider do PowerShell:
Get-ChildItem Cert:\CurrentUser\MyEsses comandos permitem consultar os certificados armazenados no repositório:
Current User
└── Personal
└── Certificates
O agente de coleta consolida os dados obtidos e envia um pacote JSON para a API do CertInventory.
A autenticação é realizada através do cabeçalho:
X-API-Key: SUA_API_KEYFluxo:
┌──────────────────────┐
│ Windows Endpoint │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ PowerShell Collector │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ Certificate Store │
│ CurrentUser\My │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ JSON Payload │
└──────────┬───────────┘
│
│ X-API-Key
▼
┌──────────────────────┐
│ CertInventory API │
└──────────────────────┘
Em ambientes de produção, recomenda-se utilizar HTTPS para proteger os dados durante o transporte.
A API é responsável pelo recebimento das informações coletadas nos endpoints Windows.
A autenticação dos agentes é realizada utilizando API Key.
Exemplo conceitual:
POST /api/...
X-API-Key: SUA_API_KEY
Content-Type: application/jsonO payload contém as informações necessárias para identificar:
- empresa;
- computador;
- usuário;
- certificado;
- número de série;
- datas de emissão e validade;
- informações relevantes para auditoria.
A documentação completa dos endpoints disponíveis pode ser consultada através do Swagger:
http://SERVER_IP:5000/docs
O CertInventory possui duas camadas principais de autenticação.
O acesso à interface web utiliza:
- usuário;
- senha;
- JWT;
- cookies
HTTP-only.
Fluxo:
Usuário
│
│ Login
▼
Dashboard
│
▼
Autenticação
│
▼
JWT
│
▼
Cookie HTTP-only
Os endpoints utilizados pelos agentes de coleta são protegidos por API Key.
PowerShell Agent
│
│ X-API-Key
▼
FastAPI
│
├── API Key válida
│ │
│ ▼
│ Processa
│
└── API Key inválida
│
▼
Rejeita
Para ambientes corporativos, recomenda-se:
- utilizar HTTPS;
- utilizar API Keys longas e aleatórias;
- utilizar uma
SECRET_KEYforte; - não versionar o
.env; - restringir o acesso à porta da aplicação através de firewall;
- realizar backups periódicos;
- manter o Docker atualizado;
- evitar utilizar credenciais padrão;
- separar credenciais de desenvolvimento e produção.
O projeto utiliza Pytest e HTTPX para testes automatizados.
O banco utilizado durante os testes é isolado em memória utilizando StaticPool, evitando alterações no banco de desenvolvimento ou produção.
A suíte cobre, entre outros pontos:
- validação de rotas HTTP protegidas;
- autenticação da API REST;
- geração de tokens JWT;
- redirecionamento de usuários não autenticados;
- cookies de autenticação;
- expiração de autenticação;
- comportamento das rotas protegidas.
Execute:
pytest test_app.py -vOu, para executar toda a suíte disponível:
pytest -vA estrutura pode variar conforme a evolução do projeto, mas uma instalação típica possui:
certinventory/
│
├── app.py
├── popular_banco.py
├── test_app.py
├── requirements.txt
│
├── Dockerfile
├── docker-compose.yml
├── .env
├── .gitignore
│
├── data/
│ └── database.db
│
├── templates/
│ └── index.html
│
└── static/
├── css/
└── js/
O CertInventory utiliza SQLite com Write-Ahead Logging (WAL).
O WAL permite que operações de leitura e escrita tenham um comportamento mais adequado em cenários com múltiplos acessos simultâneos.
A utilização do SQLite mantém a arquitetura simples e reduz a necessidade de infraestrutura adicional.
Para ambientes de maior escala, o projeto poderá utilizar PostgreSQL futuramente.
Atual
─────────────────────────────
FastAPI
│
▼
SQLite + WAL
Futuro
─────────────────────────────
FastAPI
│
▼
PostgreSQL
Em ambientes de produção, recomenda-se monitorar:
- disponibilidade da aplicação;
- utilização de CPU;
- utilização de memória;
- espaço disponível em disco;
- tamanho do banco;
- quantidade de requisições;
- códigos HTTP de erro;
- logs da aplicação;
- falhas de autenticação;
- integridade dos backups.
Integrações futuras podem incluir:
- Prometheus;
- Grafana;
- Zabbix;
- sistemas centralizados de logs.
O projeto está em evolução contínua.
- Autenticação de usuários no Dashboard
- Autenticação da API por API Key
- JWT para sessão Web
- Controle de acesso baseado em funções (RBAC)
- Auditoria de alterações
- Agrupamento inteligente de certificados idênticos
- Histórico de certificados removidos
- Alertas automáticos de expiração
- Histórico de alterações dos certificados
- Notificações por e-mail
- Integração com Microsoft Teams
- Filtros cruzados
- Exportação para PDF
- Exportação para Excel
- Impressão
- Dashboard avançado com métricas
- Gráficos utilizando Chart.js
- Docker
- Docker Compose
- Persistência do banco
- Suporte nativo a PostgreSQL
- Centralização de logs
- Integração com Grafana / Prometheus
- Agente Windows dedicado
- Distribuição automatizada via GPO
- Registro automático de computadores
- Atualização automática do agente
Mateus Vilanova dos Passos
Projeto desenvolvido com foco em:
- infraestrutura;
- segurança;
- automação;
- gerenciamento de certificados;
- administração de ambientes corporativos de TI.
Centralized certificate visibility for corporate infrastructure.