Português (Brasil)

Ferramentas de desenvolvedor · Codificador e decodificador Base64

PEM explicou: por que certificados e chaves são Base64 entre BEGIN e END

· Fundo

base64 codificação

Armadura PEM: rótulos BEGIN e END e encapsulamento Base64 da coluna 64 do binário DER
Ilustração vetorial original ToolAcre

Um arquivo PEM é um binário DER encapsulado em Base64 com linhas de blindagem rotuladas. Este post explica as origens do formato, suas regras de linha e o que você pode ou não aprender ao decodificar um.

O certificado que 'se parece com texto', mas falha na análise - um erro de digitação no cabeçalho, um retorno de carro perdido e o formato abaixo

Um arquivo PEM é um binário codificado em Base64 envolvido em rótulos de texto. O nome vem de Privacy-Enhanced Mail (RFC 1421, 1992), que usava esse formato para mensagens criptografadas. O formato sobrevive hoje em certificados TLS, chaves SSH e chaves GPG. A estrutura é simples: uma linha dizendo -----BEGIN CERTIFICATE----- (ou BEGIN PRIVATE KEY, BEGIN PUBLIC KEY, etc.), seguida por 64 linhas de caracteres de texto base64, seguidas por -----END CERTIFICATE-----.

O corpo base64 é decodificado para um formato binário chamado DER (Regras de codificação distintas), que é uma forma de serializar dados estruturados (especificamente, estruturas ASN.1). A decodificação do base64 fornece binário; ler o binário requer compreensão de ASN.1, que é complexo. A armadura PEM existe porque é difícil enviar e editar arquivos binários por e-mail. Um arquivo de certificado em formato binário puro seria corrompido quando passado por sistemas de correio antigos, USENET ou formulários da web.

A armadura de texto visível em um bloco PEM — rótulos em torno de um corpo Base64

Ao codificar o binário em base64 e agrupá-lo em rótulos de texto, todo o certificado se torna texto de 7 bits ASCII que sobrevive a qualquer transporte. Um editor de texto pode abri-lo; um sistema de correio não irá corrompê-lo. As linhas -----BEGIN e -----END são rótulos para humanos e ferramentas automatizadas; eles marcam claramente que tipo de dados estão dentro. Um certificado é rotulado como CERTIFICATE; uma chave privada é rotulada como PRIVATE KEY.

A etiqueta não é verificada por software criptográfico; é apenas uma dica para humanos e ferramentas. O limite de linha de 64 caracteres em PEM vem de RFC 1421 e o mesmo raciocínio MIME do e-mail base64: sistemas de correio antigos tinham limites de comprimento de linha e 64 caracteres cabiam em um terminal dos anos 1980. PEM envolve a saída base64 em 64 caracteres com um final de linha (CR LF no Windows, LF no Unix).

De texto rotulado a bytes decodificados — este repositório não estabelece o histórico de formato

Ao decodificar um certificado PEM, o analisador deve remover as linhas de armadura (-----BEGIN..., -----END...) e as quebras de linha e, em seguida, decodificar o restante em base64. Um retorno de carro perdido ou um rótulo incompatível pode interromper a análise. A quebra de linha não faz parte do padrão base64 (RFC 4648 base64 é desembrulhada); é específico para PEM. Dentro do base64 está o binário codificado em DER. DER é ASN.1 (Notação de Sintaxe Abstrata), uma especificação complexa para representar estruturas de dados.

Um certificado é um registro estruturado que contém um nome de entidade, uma chave pública, uma assinatura e metadados. ASN.1 não descreve os bytes diretamente; descreve como a estrutura deve ser codificada.

Anatomia do bloco como entrada para esta ferramenta — remova os rótulos e passe apenas o corpo Base64

A codificação começa com trigêmeos tag-comprimento-valor. Por exemplo, um SEQUENCE em ASN.1 é codificado como tag 0x30, seguido pelo comprimento do conteúdo, seguido pelo próprio conteúdo. Um certificado sempre começa com os bytes 0x30 0x82 (sequência, comprimento codificado em dois bytes), que aparece como MII em base64.

Verificando um certificado sem analisá-lo: os três primeiros caracteres de um corpo de certificado PEM são quase sempre MII (que é 0x30 0x82 em base64, o início de um SEQUENCE). Se um bloco PEM não for decodificado para 0x30, o base64 está corrompido ou o rótulo está errado. A ferramenta codificador e decodificador Base64 pode decodificar o corpo e mostrar o hexadecimal: cole as linhas base64 (sem a armadura -----BEGIN e END), remova as quebras de linha e decodifique.

O que a decodificação expõe: bytes binários, campos de certificado não analisados

Se a saída for binária começando com 30 82, provavelmente é uma estrutura de certificado válida. Se for algo sem sentido ou texto, a decodificação falhou ou a base64 está errada. Erros PEM comuns: uma incompatibilidade de rótulo (por exemplo, um corpo de certificado com um rótulo PRIVATE KEY), um problema de final de linha do Windows (alguns analisadores engasgam com CRLF), um erro de digitação na linha de blindagem (espaços ou caracteres extras) ou quebras de linha ausentes.

As ferramentas esperam -----BEGIN CERTIFICATE----- e não -----BEGIN CERT----- ou BEGIN CERTIFICATE. Copiar e colar um PEM de um navegador da web ou um PDF pode introduzir aspas Unicode ou aspas inteligentes em vez de aspas ASCII, quebrando o rótulo. Colar uma chave privada em um campo de certificado é um erro comum; o analisador irá rejeitá-lo porque o rótulo não corresponde. PEM oferece suporte a vários blocos em um arquivo.

Exemplo resolvido: decodifique um corpo curto e inspecione bytes sem declarar uma assinatura de certificado

Um arquivo de chave SSH pode conter uma chave privada (rotulada PRIVATE KEY) e uma chave pública (rotulada PUBLIC KEY) ou vários blocos de certificado. Um analisador lê o arquivo de cima para baixo, procurando linhas que começam com -----BEGIN. Quando encontra um, ele lê até -----END com rótulo correspondente, extrai e decodifica em base64 o corpo e o processa. Então continua procurando o próximo bloco.

Uma cadeia de certificados concatenada acidentalmente (vários blocos PEM para um certificado e seus intermediários) em um arquivo será válida se todos os rótulos estiverem corretos. O formato PEM foi padronizado para correio com privacidade aprimorada (RFC 1421) no início da década de 1990.

O que isso não cobre — análise de estruturas ASN.1, criptografia de chave privada e pacotes configuráveis ​​PKCS#12

RFC 7468 (2015) modernizou a definição, esclarecendo as regras de comprimento de linha, formato de linha de armadura e casos extremos. A maioria das ferramentas e padrões fazem referência a RFC 7468 agora. Existem outros formatos binário para texto (como DER-to-hex para alguns protocolos), mas PEM com rótulos base64 e ASCII é o padrão de fato para criptografia e TLS porque é legível por humanos, texto simples e fácil de copiar ou enviar.

Construindo um bloco PEM: pegue o binário DER (por exemplo, um certificado de uma biblioteca criptográfica), codifique-o em base64, envolva o resultado em 64 caracteres com quebras de linha e coloque-o entre -----BEGIN CERTIFICATE----- e -----END CERTIFICATE----- linhas. Analisando um bloco PEM: encontre as linhas -----BEGIN e -----END, extraia o corpo base64 (removendo a armadura e as quebras de linha), decodificação base64 para obter o binário e, em seguida, analise o binário DER e ASN.1.

Conclusão: PEM é Base64 com rótulos - como o codificador e decodificador Base64 oferece um local local para testar o corpo Base64 de um bloco, inteiramente no navegador

A maioria das ferramentas automatiza isso; você raramente constrói PEM manualmente. Mas compreender a estrutura é útil ao depurar um erro de análise ou ao verificar manualmente um certificado. Um certificado PEM parece texto, mas o conteúdo são dados binários. A leitura dos rótulos inicial e final não informa o que o certificado contém; você deve decodificar base64 e analisar ASN.1 para ver o nome do assunto, chave pública, emissor e expiração.

A ferramenta codificadora e decodificadora Base64 pode decodificar o corpo para que você possa inspecionar os primeiros bytes. Para uma análise completa, você precisa de um analisador ASN.1 (a maioria das linguagens de programação possui bibliotecas para isso). O principal insight é que PEM é um formato de contêiner: ele contém quaisquer dados codificados em DER, não apenas certificados. O rótulo informa o uso pretendido, mas o analisador deve tratar o tipo de dados corretamente.