Каждое значение имеет вид «тег — длина — значение»: байт тега (0x30 SEQUENCE, 0x02 INTEGER, 0x03 BIT STRING, 0x04 OCTET STRING, 0x05 NULL, 0x06 OBJECT IDENTIFIER, 0x0C UTF8String, 0x17 UTCTime), длина (один байт, если она меньше 128, иначе 0x81/0x82… и за ним байты длины) и содержимое. DER — ограниченная форма BER: только длины определённой формы, минимальное кодирование длин и целых чисел, 0xFF для TRUE, отсортированные элементы SET OF.
Каноническое кодирование важно, потому что подпись покрывает точные байты: tbsCertificate сертификата при повторном кодировании должен давать те же самые байты, иначе подпись не пройдёт проверку. Нестрогие парсеры, которые принимают BER там, где требуется DER, приводили к пластичности подписей (BIP 66 в Bitcoin) и к обходу проверки в нескольких библиотеках.
Целые числа в DER знаковые, поэтому к положительному значению, у которого установлен старший бит, в начало добавляется 0x00; именно поэтому подписи ECDSA в DER для P-256 занимают от 70 до 72 байт. PEM — это просто DER в base64 со строками заголовка BEGIN и END. Просмотр структуры ASN.1 локально декодирует любую структуру DER.