Сообщение об ошибке
error:0680009B:asn1 encoding routines:ASN1_get_object:too long
Воспроизведено на OpenSSL 3.6; OpenSSL 1.1.x выводит ту же ошибку как «error:0D07209B:asn1 encoding routines:ASN1_get_object:too long». Ошибка «header too long», которую часто ищут (error:0680007B в OpenSSL 3, error:0D07207B в 1.1.x), — родственная: входные данные заканчиваются раньше, чем завершится сам заголовок с тегом и длиной. Так бывает с пустым или однобайтовым файлом либо с заголовком, оборванным посреди поля длины.
Что это означает
DER-парсер прочитал то, что должно быть заголовком ASN.1 (тег и длина), и получил длину, превышающую объём доступных данных, — классический признак того, что «эти байты не DER». Обычно входные данные — это текст base64, PEM или обрезанные данные, которые разбирают как двоичный DER, а не структура с едва заметной ошибкой.
Почему это происходит
Текст Base64/PEM разбирается как двоичный DER
частоСимволы ASCII, прочитанные как байты тега и длины, сразу дают абсурдные значения длины. Хрестоматийный случай — флаг -inform der для файла в формате PEM (или передача base64 через конвейер без декодирования).
Обрезанный DER
частоПрерванное скачивание, ограничение длины столбца в базе данных или копирование, при котором теряются последние байты, оставляют заголовок, объявляющий больше содержимого, чем есть на самом деле. Длина внешнего SEQUENCE перестаёт совпадать с размером файла.
Склеенные или смещённые данные
иногдаЛишние байты перед настоящей структурой (сохранённые в файл HTTP-заголовки, служебное обрамление другого протокола) сдвигают парсер на байты, которые читаются как некорректный заголовок; в зависимости от байтов это даёт либо эту ошибку, либо родственную «header too long». С коротким префиксом длины данные могут быть и молча разобраны неверно: тогда asn1parse не завершается ошибкой, а выводит бессмысленную первую строку.
Как исправить
- 1.
Согласуйте формат входных данных с парсером
Сначала декодируйте base64 или сообщите инструменту, что это PEM. По умолчанию asn1parse ожидает входные данные в формате PEM; -inform der нужен только для настоящих двоичных данных.
bash # base64 signature/blob → DER, then parse openssl base64 -d -in sig.b64 | openssl asn1parse -inform der # PEM object: let asn1parse handle the armor itself openssl asn1parse -in cert.pem - 2.
Проверяйте размер перед разбором
Подпись ECDSA P-256 в DER занимает около 70–72 байт и начинается с 0x30. 96-байтовая «подпись», скорее всего, закодирована в base64, а 64 байта — это формат raw r‖s, который вовсе не DER.
bash wc -c < sig.der head -c 8 sig.der | xxd # 30 44/45/46 ... → DER SEQUENCE - 3.
Если это подпись в формате raw r‖s, преобразуйте её
JWS и WebCrypto выдают 64-байтовые подписи ECDSA в формате raw, которые не примет ни один DER-парсер. Конвертер ниже преобразует raw в DER (и обратно) и показывает целые числа r и s: вставьте байты и посмотрите, какой формат у вас на самом деле.