Сообщение об ошибке
error:0480006C:PEM routines::no start line
Воспроизведено на Node 26 (OpenSSL 3.5) с X509Certificate и tls.createSecureContext(). OpenSSL 1.1.1 выводит ту же ошибку как «error:0909006C:PEM routines:get_name:no start line», OpenSSL 1.1.0 — как «error:0906D06C:PEM routines:PEM_read_bio:no start line». Родственная ошибка: «error:04800066:PEM routines::bad end line», если повреждён маркер END.
OpenSSL 3.x — also surfaces in Node as ERR_OSSL_PEM_NO_START_LINE
Что это означает
Парсер PEM искал во входных данных строку «-----BEGIN ...-----», соответствующую ожидаемому объекту, и не нашёл её. Либо файл вообще не в формате PEM (двоичный DER, JSON, пустой файл), либо метка BEGIN называет не тот объект, который нужен парсеру, либо обрамление повредилось по пути.
Почему это происходит
Двоичные данные DER переданы парсеру PEM
частоФайлы .der/.cer/.pfx двоичные; строки BEGIN в них нет по определению. Загрузчики, которые читают только PEM (tls.createSecureContext() для сертификата, командная строка OpenSSL 1.1), выдают именно эту ошибку. (X509Certificate в Node и команды OpenSSL 3 сами распознают DER.)
Несовпадение метки: файл тот, объект не тот
частоКаждый парсер ищет свою метку. Код, читающий сертификаты, целиком пропускает блоки «-----BEGIN PRIVATE KEY-----» и сообщает no start line — формально верно: начальной строки CERTIFICATE действительно нет.
Обрамление повреждено при передаче
частоБуквальные последовательности \n из переменных окружения или JSON либо похожие на дефис символы тире, вставленные из редактора документов, мешают найти строку BEGIN. BOM UTF-8 перед первым дефисом ломает OpenSSL 1.1 (OpenSSL 3 и Node его пропускают); окончания строк CRLF из Windows и отсутствие перевода строки в конце файла допускаются.
Как исправить
- 1.
Посмотрите на первые байты
Одной строки вывода xxd достаточно, чтобы отличить PEM (дефисы ASCII), DER (первый байт 0x30) и мусор. Затем преобразуйте или исправьте файл в зависимости от результата.
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.
Восстановите PEM, повреждённый при передаче
Восстановите переводы строк и удалите BOM/CR. После исправления строка BEGIN должна состоять ровно из 5 дефисов, метки и ещё 5 дефисов.
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.
В Node нормализуйте данные перед разбором
X509Certificate и параметр cert функции tls.createSecureContext() выдают ту же ошибку с кодом ERR_OSSL_PEM_NO_START_LINE; в большинстве случаев помогает исправление переводов строк из переменной окружения. Загрузчики ключей (createPublicKey, createPrivateKey) на нераспознаваемые входные данные выдают вместо этого «error:1E08010C:DECODER routines::unsupported».
js import { X509Certificate } from "node:crypto"; const cert = new X509Certificate(process.env.CERT_PEM.replace(/\\n/g, "\n"));