Mensagem de erro
error:0480006C:PEM routines::no start line
Reproduzido no Node 26 (OpenSSL 3.5) com X509Certificate e tls.createSecureContext(). O OpenSSL 1.1.1 imprime a mesma falha como “error:0909006C:PEM routines:get_name:no start line”, e o OpenSSL 1.1.0, como “error:0906D06C:PEM routines:PEM_read_bio:no start line”. Um erro da mesma família: “error:04800066:PEM routines::bad end line”, quando o marcador END está danificado.
OpenSSL 3.x — also surfaces in Node as ERR_OSSL_PEM_NO_START_LINE
O que significa
Um parser de PEM procurou na entrada uma linha “-----BEGIN ...-----” correspondente ao objeto que espera e não encontrou nenhuma. Ou o arquivo nem é PEM (DER binário, JSON, vazio), ou o rótulo do BEGIN nomeia um objeto diferente do que o parser quer, ou a formatação foi corrompida no caminho.
Por que acontece
Dados DER (binários) passados a um parser de PEM
comumArquivos .der/.cer/.pfx são binários; por definição, não contêm linha BEGIN. Carregadores que só leem PEM — tls.createSecureContext() para um certificado, a linha de comando do OpenSSL 1.1 — caem exatamente aqui. (O X509Certificate do Node e os comandos do OpenSSL 3 detectam DER por conta própria.)
Rótulo divergente: arquivo certo, objeto errado
comumCada parser procura o próprio rótulo. Um código que lê certificados ignora por completo os blocos “-----BEGIN PRIVATE KEY-----” e informa “no start line” — o que é tecnicamente verdade: não existe nenhuma linha inicial CERTIFICATE.
Formatação quebrada no transporte
comumSequências \n literais vindas de variáveis de ambiente ou de JSON, ou traços parecidos colados de um editor de documentos, impedem que a linha BEGIN seja reconhecida. Um BOM UTF-8 antes do primeiro traço quebra o OpenSSL 1.1 (o OpenSSL 3 e o Node o ignoram); finais de linha CRLF do Windows e a falta de uma quebra de linha no fim do arquivo são tolerados.
Como corrigir
- 1.
Ver os primeiros bytes
Uma linha de xxd distingue PEM (traços ASCII), DER (primeiro byte 0x30) e lixo. Depois, converta ou corrija conforme o caso.
bash head -c 32 file | xxd # 2d 2d 2d 2d 2d ("-----") → PEM: check the label matches what the tool expects # 30 82 ... → DER: add -inform der or convert: openssl x509 -inform der -in cert.der -out cert.pem - 2.
Reparar o PEM corrompido no transporte
Restaure as quebras de linha e remova BOM/CR. Depois do reparo, a linha BEGIN deve ser exatamente cinco traços, o rótulo e cinco traços.
bash printf '%s' "$PEM_VAR" | sed 's/\\n/\n/g' | sed '1s/^\xef\xbb\xbf//' | tr -d '\r' > fixed.pem head -1 fixed.pem # -----BEGIN CERTIFICATE----- - 3.
No Node, normalizar antes de analisar
O mesmo erro aparece com o código ERR_OSSL_PEM_NO_START_LINE no X509Certificate e na opção cert de tls.createSecureContext(); corrigir as quebras de linha da variável de ambiente resolve a maioria dos casos. Já as funções que carregam chaves (createPublicKey, createPrivateKey) relatam uma entrada que não conseguem analisar como “error:1E08010C:DECODER routines::unsupported”.
js import { X509Certificate } from "node:crypto"; const cert = new X509Certificate(process.env.CERT_PEM.replace(/\\n/g, "\n"));