Mensaje de error
error:0480006C:PEM routines::no start line
Reproducido en Node 26 (OpenSSL 3.5) con X509Certificate y tls.createSecureContext(). OpenSSL 1.1.1 imprime el mismo fallo como «error:0909006C:PEM routines:get_name:no start line», y OpenSSL 1.1.0, como «error:0906D06C:PEM routines:PEM_read_bio:no start line». Un error emparentado: «error:04800066:PEM routines::bad end line», cuando el marcador END está dañado.
OpenSSL 3.x — also surfaces in Node as ERR_OSSL_PEM_NO_START_LINE
Qué significa
Un analizador PEM recorrió la entrada en busca de una línea «-----BEGIN ...-----» que corresponda al objeto que espera y no encontró ninguna. O bien el archivo no es PEM en absoluto (DER binario, JSON, vacío), o bien la etiqueta BEGIN nombra un objeto distinto del que quiere el analizador, o bien la estructura de líneas del PEM se estropeó por el camino.
Por qué ocurre
Datos DER (binarios) pasados a un analizador PEM
frecuenteLos archivos .der/.cer/.pfx son binarios; por definición no contienen ninguna línea BEGIN. Los cargadores que solo leen PEM —tls.createSecureContext() para un certificado o la línea de comandos de OpenSSL 1.1— acaban exactamente aquí. (X509Certificate de Node y los comandos de OpenSSL 3 detectan DER por sí solos).
Etiqueta que no coincide: archivo correcto, objeto equivocado
frecuenteCada analizador busca su propia etiqueta. El código que lee certificados se salta por completo los bloques «-----BEGIN PRIVATE KEY-----» e informa de que no hay línea de inicio, lo cual es técnicamente cierto: no existe ninguna línea de inicio CERTIFICATE.
Estructura de líneas dañada en el transporte
frecuenteLas secuencias \n literales procedentes de variables de entorno o de JSON, o los caracteres parecidos al guion pegados desde un editor de documentos, impiden que se reconozca la línea BEGIN. Un BOM UTF-8 antes del primer guion hace fallar a OpenSSL 1.1 (OpenSSL 3 y Node lo omiten); los finales de línea CRLF de Windows y la falta de un salto de línea final se toleran.
Cómo solucionarlo
- 1.
Mirar los primeros bytes
Una sola línea de xxd distingue PEM (guiones ASCII), DER (primer byte 0x30) y basura. Después, convierte o corrige según corresponda.
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 un PEM dañado en el transporte
Restaura los saltos de línea y elimina el BOM y los CR. Tras la reparación, la línea BEGIN debe ser exactamente cinco guiones, la etiqueta y cinco guiones.
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.
En Node, normalizar antes de analizar
El mismo error aparece con el código ERR_OSSL_PEM_NO_START_LINE en X509Certificate y en la opción cert de tls.createSecureContext(); restaurar los saltos de línea de la variable de entorno resuelve la mayoría de los casos. En cambio, cuando los cargadores de claves (createPublicKey, createPrivateKey) no pueden analizar la entrada, informan de «error:1E08010C:DECODER routines::unsupported».
js import { X509Certificate } from "node:crypto"; const cert = new X509Certificate(process.env.CERT_PEM.replace(/\\n/g, "\n"));