Autenticador headless compatível com o fluxo do PJe Office do CNJ (Conselho Nacional de Justiça).
Este serviço expõe um endpoint HTTP local que recebe um desafio (challenge), assina com o seu certificado A1 (PKCS#12) e envia a resposta ao endpoint do tribunal.
⚠️ Aviso: projeto não-oficial. Implementa, de forma independente, o comportamento do cliente PJe Office com base na codebase do PJeOffice Pro (CNJ)/ Java e na observação do protocolo. Não é mantido pelo CNJ.
- Assinatura RSA com
MD5withRSA(padrão histórico),SHA1withRSAeSHA256withRSA. - Envio da cadeia de certificados em PKIPath (ASN.1) — implementado com
SequenceOftipado. - Servidor IPv6/IPv4, CORS liberado e
Access-Control-Allow-Private-Network.
python -m venv .venv
source .venv/bin/activate
pip install -U pip
pip install -e .
python -m pjeoffice_headless --certificate /caminho/cert.pfx --password "senha" --port 8800Health-check:
curl -I http://localhost:8800/pjeOffice/docker build -t pjeoffice-headless:1.0.0 .docker run --rm \
-e PJE_CERT_PATH=/certs/cert.pfx \
-e PJE_CERT_PASS="sua-senha" \
-e PJE_PORT=8800 \
-v /caminho/real/cert.pfx:/certs/cert.pfx:ro \
-p 127.0.0.1:8800:8800 \
pjeoffice-headless:1.0.0docker compose up -dDica de segurança: mantenha o mapeamento em
127.0.0.1:8800:8800para evitar exposição externa. Se precisar HTTPS no localhost, coloque um reverse proxy (Nginx/Caddy) com TLS fazendo proxy parahttp://pjeoffice-headless:8800.
GET /pjeOffice/— GIF 1×1 (OK) para health-check.GET /pjeOffice/requisicao/?r=<payload_url_encoded>— modo “image ping” legado.POST /pjeOffice/requisicao/— recomendado, com JSON no corpo.
{
"servidor": "https://exemplo.jus.br",
"versao": "2.5.16",
"sessao": "AWSALB=...; AWSALBCORS=...; JSESSIONID=...",
"tarefa": "{\"mensagem\":\"<DESAFIO>\",\"enviarPara\":\"/callback\",\"token\":\"<UUID>\",\"algoritmoAssinatura\":\"MD5withRSA\"}"
}Campos:
-
servidor: base do host de destino; será concatenado comenviarPara. -
versao: cabeçalhoversao(default interno:2.5.16). -
sessao: cookies de sessão (opcional). -
tarefa(string JSON):mensagem: desafioenviarPara: path do endpoint remototoken: identificadoralgoritmoAssinatura:MD5withRSA(padrão),SHA1withRSAouSHA256withRSA.
Exemplo POST:
curl -sS -X POST http://localhost:8800/pjeOffice/requisicao/ \
-H "Content-Type: application/json" \
-d '{"servidor":"https://exemplo.jus.br","tarefa":"{\"mensagem\":\"abc123\",\"enviarPara\":\"/api/assinatura\",\"token\":\"uuid-123\",\"algoritmoAssinatura\":\"SHA256withRSA\"}"}'Constantes internas (podem ser alteradas no código):
PJE_VERSION="2.5.16"CONNECT_TIMEOUT=3(s)READ_TIMEOUT=10(s)SUCCESS_CODES = {200, 201, 202, 204, 302, 304}
Variáveis de ambiente no Docker:
PJE_CERT_PATH(obrigatório) — caminho do.pfx/.p12montado.PJE_CERT_PASS(obrigatório) — senha do certificado.PJE_PORT(opcional, default8800) — porta exposta pelo servidor.
- CNJ — Conselho Nacional de Justiça: https://www.cnj.jus.br/
- PJeOffice Pro (CNJ): esta implementação foi inspirada e baseada na codebase/fluxo do PJeOffice Pro do CNJ e no protocolo observado nas integrações oficiais. Este projeto é independente e não-oficial. Foi feita a engenharia reversa, decompilando a aplicação Java com o Lyuten https://github.com/deathmarine/Luyten.