Tutorial · Backend

e-CPF vs. e-CNPJ: lendo os dados do certificado no backend

Você validou a cadeia e tem um certificado ICP-Brasil legítimo em mãos. Agora precisa da informação que importa — CPF, CNPJ, nome do titular. O problema: a ICP-Brasil guarda isso onde o X.509 padrão não olha.

OIDs proprietários · ASN.1 e-CPF · e-CNPJ · A1 · A3 Leitura: ~8 min
Neste guia
  1. Onde a ICP-Brasil esconde os dados
  2. Os OIDs que você precisa conhecer
  3. Fazendo o parsing da extensão
  4. O que muda entre e-CPF e e-CNPJ
  5. Armadilhas de parsing
  6. Por que isso quebra com o tempo

Onde a ICP-Brasil esconde os dados

Se você já leu um certificado X.509 comum, sabe que o nome do titular fica no campo Subject (o Distinguished Name). O reflexo natural é procurar o CPF ali. Não está lá — pelo menos não de forma confiável e estruturada.

A ICP-Brasil define, na sua normativa, que os dados da pessoa física ou jurídica ficam em extensões próprias do certificado, identificadas por OIDs (Object Identifiers) sob o arco 2.16.76.1.3, que é o ramo brasileiro. Dentro dessas extensões, os campos não vêm rotulados: vêm concatenados numa string, por posição fixa. Quem lê precisa saber, de antemão, qual pedaço é o quê e quantos caracteres ocupa.

Por que assim? A especificação foi desenhada antes de padrões mais amigáveis se consolidarem, e mantém compatibilidade com uma base enorme de certificados já emitidos. O resultado prático para quem integra: um formato posicional rígido, sem rótulos, que você decodifica na mão.

Os OIDs que você precisa conhecer

Cada tipo de titular e cada dado tem seu próprio OID. Os principais que você vai encontrar ao ler um certificado de autenticação:

OID
Conteúdo
2.16.76.1.3.1
Pessoa física (e-CPF): data de nascimento, CPF, NIS/PIS, RG e órgão emissor — tudo concatenado.
2.16.76.1.3.2
Nome do responsável pelo certificado de pessoa jurídica.
2.16.76.1.3.3
Pessoa jurídica (e-CNPJ): o CNPJ da empresa titular.
2.16.76.1.3.4
Dados adicionais do responsável (nascimento, CPF, etc.) no certificado PJ.

Note que um e-CNPJ carrega os dois: o CNPJ da empresa e os dados do responsável pessoa física. Já um e-CPF só tem a pessoa física. Isso muda como você trata cada caso na aplicação.

Fazendo o parsing da extensão

O fluxo é sempre o mesmo: localizar a extensão pelo OID, pegar os bytes brutos, e fatiar por posição. Um exemplo em Python (o mesmo raciocínio vale para C#, Java ou qualquer linguagem):

python — localizando e lendo a extensão do e-CPF
from cryptography import x509
from cryptography.x509.oid import ObjectIdentifier

OID_PESSOA_FISICA = ObjectIdentifier("2.16.76.1.3.1")

def ler_dados_ecpf(cert: x509.Certificate):
    for ext in cert.extensions:
        if ext.oid == OID_PESSOA_FISICA:
            raw = ext.value.value   # bytes da extensão (UnrecognizedExtension)
            texto = raw.decode("latin-1", errors="ignore")

            # campos por posição (offsets conforme a normativa ICP-Brasil):
            #   8 dígitos  -> data de nascimento (DDMMAAAA)
            #  11 dígitos  -> CPF
            #  11 dígitos  -> NIS/PIS/PASEP
            #  15 dígitos  -> RG
            #   6 dígitos  -> órgão emissor + UF
            nascimento = texto[0:8]
            cpf        = texto[8:19]
            return {"nascimento": nascimento, "cpf": cpf}
    return None
O código acima é ilustrativo, não completo. Os offsets exatos, o tratamento de campos opcionais e a codificação (algumas ACs preenchem com espaços, outras com zeros) exigem seguir a normativa à risca e testar contra certificados reais de várias ACs. Um offset errado por um caractere devolve um CPF inválido silenciosamente — o pior tipo de bug, porque não estoura, só erra.

O que muda entre e-CPF e e-CNPJ

Aspecto
e-CPF
e-CNPJ
Titular
Pessoa física
Empresa (+ responsável PF)
OID principal
2.16.76.1.3.1
2.16.76.1.3.3
Documento-chave
CPF
CNPJ
Dados de PF
Do próprio titular
Do responsável legal
No login
Identifica a pessoa
Identifica empresa + operador

Na prática, sua aplicação precisa primeiro detectar o tipo (procurando qual OID está presente) e só então aplicar o parsing correto. Tratar os dois com o mesmo código é a origem clássica de "o CNPJ veio no lugar do CPF".

Armadilhas de parsing

Por que isso quebra com o tempo

O parser que você escreve hoje funciona para os certificados que você testou hoje. O problema aparece depois, e sempre da mesma forma: um cliente novo tenta entrar, tem um certificado de uma AC ou versão que seu código não previu, e o parsing devolve lixo — ou um CPF sutilmente errado que passa despercebido até virar um problema de dados sério.

Manter esse componente exige:

É um pedaço pequeno de código com um custo de manutenção desproporcional — porque erro aqui não é um bug de tela, é um dado de identidade errado entrando no seu sistema.

Ou receba os dados prontos

CPF, CNPJ e nome do titular — já estruturados

O IHub-Auth faz todo esse parsing por você e devolve os dados do titular já limpos e validados, via verificação server-to-server. Sem OID proprietário, sem contagem de offset, sem surpresa com o certificado de um cliente específico. A cadeia ICP-Brasil completa e as regras de formato ficam do nosso lado — você recebe um JSON pronto para o login.