Pular para o conteúdo principal

Serviço Autoridades Certificadoras

O serviço tem por objetivo manter atualizada as duas listas de autoridades certificadoras utilizadas pela biblioteca ICPBr-Util e que são utilizadas para validar os certificados digitais utilizados pelos usuários no PJe. Que são os arquivos: intermedirias.zip e confiaveis.zip.

Início rápido

Criar um novo banco de dados
createdb -T template0 --encoding='UTF-8'  -U${USER} -h${HOST} autoridades_certificadoras;
Baixa imagem docker
docker pull registry.cnj.jus.br/pje2/pje2-auxiliares/pje-autoridades-certificadoras:latest
Criar as variáveis de ambiente básicas
export RABBITMQ_HOST=localhost
export RABBIT_USERNAME=guest
export RABBIT_PASSWORD=guest
export DB_ADDR=localhost
export DB_DATABAS=autoridades_certificadoras
export DB_USER=postgres
export DB_PASSWORD=admin123
export EUREKA_REGISTER_ENABLE=true
export EUREKA_SERVER_DEFAULT_ZONE=http://localhost:8761/eureka
Subir container com a imagem acima
docker run registry.cnj.jus.br/pje2/pje2-auxiliares/pje-autoridades-certificadoras:latest

Tecnologias empregadas

O serviço foi construído com SpringBoot 2. Este serviço fornece API+ para manipulação e recuperação de seus recursos utilizando _REST e banco de dados relacional.

Utiliza o broker de mensagens RabbitMQ para produzir mensagens da exchange do PJe pje.exchange.

Internamente possui um script feito em python 2.2.7+ responsável por buscar a informação de atualização e conversão do pacote de autoridades certificadoras do site da ICP-Brasil.

Linguagem de programação

Java 8 e Python 2.x.

Framework

SpringBoot 2.

Armazenamento dos dados

PostgreSQL.

Outros temas

O serviço recupera a informação da lista de autoridades certificadoras diretamente do site do ITI aqui: https://www.iti.gov.br/repositorio/repositorio-ac-raiz.

Visão arquitetural

O serviço (autoridades-certificadoras) possui um scheduler para buscar no site do ICPBR por uma atualização da lista de ACs, se houver, guarda no seu banco um arquivo já convertido igual ao intermediarias.zip e calcula seu checksum, além desse arquivo, o script verifica quais são os certificados raíz ICP-Brasil que estão presentes no pacote intermediarias e faz o download das demais versões desse certificado diretamento do site do ICPBR, armazenando também o arquivo confiaveis.zip em seu banco;

Ao final do processo de atualização é enviada uma mensagem ao RabbitMQ da plataforma com os meta-dados dessa atualização, indicando o novo checksum;

Os demais serviços devem se inscrever no routingKey deste serviço ..autoridades-certificadoras.AutoridadesCertificadoras.POST ou consultar o endpoint /api/v1/meta-dados/atualizacao/{data-atual} para identificar qual é a última versão da lista de autoridades certificadoras (checksum do intermediarias e checksum do confiáveis), se o checksum remoto for diferente do checksum local, o serviço interessado deverá fazer outra chamada para recuperar o arquivo binário correspondente (uns 250KB para o intermediarias e outros 11KB para o confiáveis) em /api/v1/binarios/intermediarias/{checksum-intermediarias} e /api/v1/binarios/confiaveis/{checksum-confiaveis};

O arquivo original recuperado do ICPBR pode ser baixado no endpoint /api/v1/binarios/accompactado/{checksum-accompactado};

Os arquivos binários serão recuperados no formato base64, juntamente com a indicação de qual foi o codec utilizado para o cálculo do checksum (por padrão SHA-512), o checksum assinado pela chave privada do serviço, a chave pública que pode ser utilizada para validar a assinatura e qual o algoritmo utilizado para assinar (por padrão RSA).

Imagem do fluxo de atualização das cadeias de certificados digitais

Dependências

ServiçoTipoDescrição
Site ITILista de autoridades certificadorasDepende do site estar disponível e com uma taxa de resposta adequada para poder recuperar a lista de autoridades certificadoras corretamente.
Notou-se que é comum que o site tenha problemas na resposta às requisições.
RabbitMQMensagensDepende do broker de mensagens para enviar atualizações.

Configuração da aplicação

VariávelValor padrãoDescrição
APP_NAMEautoridades-certificadorasNome do serviço quando for se registrar no serviço de descoberta.
SERVER_PORT8815Porta padrão de funcionamento do serviço.
RABBITMQ_HOSTlocalhostURL do serviço de mensageria RabbitMQ.
RABBIT_USERNAMEguestNome de usuário no serviço de mensageria.
RABBIT_PASSWORDguestSenha do usuário no serviço de mensageria.
DB_ADDRlocalhostEndereço de acesso ao banco de dados.
DB_PORT5432Porta do banco de dados.
DB_DATABASEautoridades_certificadorasNome do banco de dados.
DB_USERpostgresNome de usuário no banco de dados.
DB_PASSWORDadmin123Senha de usuário no banco de dados.
EUREKA_REGISTER_ENABLEtrueIndicativo de que o serviço deve ou não se registrar no serviço de discoberta.
EUREKA_SERVER_DEFAULT_ZONEhttp://localhost:8761/eurekaUrl do serviço de discoberta.
CRYPTO_TTL6Faz referência ao tempo em que o token simétrico para POST de binários é válido (em minutos).
SYMMETRIC_KEYCHAVESIMETRICAChave simétrica utilizada para assinar o token para POST de binários.
ASYMMETRIC_PRIVATE_KEY_FILEKeyPair/autoridadesCertificadoras.keyChave privada utilizada para assinar o checksum.
ASYMMETRIC_PUBLIC_KEY_FILEKeyPair/autoridadesCertificadoras.pubChave púlica para desassinar o checksum (deve ser replicada nos demais serviços que utilizam, principalmente icpbr-util).
SCRIPT_BUSCADOR_COMMAND_TYPEpythonTipo de script para buscar informações sobre as atualizações do ICPBR.
SCRIPT_BUSCADOR_COMMANDbuscadorACs.pyScript para buscar informações sobre as atualizações do ICPBR.

Configuração do armazenamento de dados

Este serviço utiliza banco de dados PostgreSQL versão 9.6 ou superior. A base de dados deve ter encoding UTF-8. Para a execução do serviço é necessário apenas que já haja o banco criado e que o usuário de banco da aplicação tenha permissão de DDL e DMLs, o próprio serviço criará o banco automaticamente.

Papeis e/ou recursos

Não contém papeis. Para acessar as funcionalidades de POST de meta-dados e de POST de binários é necessário encaminhar um token pré-gerado pelo sistema com validade equivalente ao informado na variável CRYPTO_TTL (em minutos).

Interações com o barramento de mensagens

O serviço é um produtor no barramento de mensagens. As mensagens são todas direcionadas à exchange geral da plataforma: pje.exchange. Com o routingKey: 000.0.autoridades-certificadoras.AutoridadesCertificadoras.POST cujo objeto é o dado pela classe: MetaDadosConjuntoACsCloudEvent.

Filas que escuta

Não há!

Mensagens que produz

As mensagens são enviadas sempre em que há uma nova versão do arquivo de autoridades certifidadoras disponível. O serviço então encaminhará uma mensagem utilizando o payload dado pela classe MetaDadosConjuntoACsCloudEvent, com o routingKey 000.0.autoridades-certificadoras.AutoridadesCertificadoras.POST à exchange principal da plataforma: pje.exchange.

Interações com outros serviços

O serviço possui apenas um script feito em Python para interagir diretamente com o site ICPBrasil para buscar, validar, transformar e armazenar a informação relativa às autoridades certificadoras.

Documentação das interfaces do serviço

http://gateway.prd.cnj.cloud/autoridades-certificadoras/v2/api-docs

Eventos de Webhook

Pode-se utilizar para eventos de webhook o próprio evento encaminhado à exchange principal do RabbitMQ.