Открыть сервис

Формат PEM

PEM (Privacy-Enhanced Mail) — это текстовый формат представления криптографических данных, таких как сертификаты, закрытые ключи, открытые ключи и запросы на подпись сертификата (CSR). Формат основан на кодировке Base64 и включает в себя специальные строки-разделители, указывающие начало и конец данных, а также заголовок, описывающий тип содержимого. PEM широко используется в системах, работающих с протоколами TLS/SSL, S/MIME, DNSSEC и другими криптографическими приложениями, особенно в экосистеме Unix-подобных операционных систем и веб-серверов.

История и происхождение

Формат PEM был первоначально разработан в 1993 году в рамках проекта Privacy-Enhanced Mail (RFC 1421), который ставил целью обеспечение конфиденциальности и аутентификации электронной почты с использованием криптографии с открытым ключом. Однако сама система PEM как почтовый протокол не получила широкого распространения из-за сложностей управления ключами и конкуренции со стороны более простых решений, таких как PGP (Pretty Good Privacy).

Тем не менее, формат представления данных, введённый в RFC 1421, оказался удобным и был заимствован для хранения и передачи сертификатов X.509 и ключей. Впоследствии он был стандартизирован в RFC 7468 (2015 год) под названием «Textual Encodings of PKIX, PKCS, and CMS Structures». Сегодня PEM является де-факто стандартом для обмена криптографическими объектами в большинстве открытых систем.

Структура и синтаксис

Файл в формате PEM представляет собой обычный текстовый файл (кодировка ASCII или UTF-8), который состоит из следующих обязательных элементов:

  1. Строка-заголовок (preamble): Начинается с пяти дефисов, за которыми следует слово BEGIN, затем пробел, идентификатор типа данных (например, CERTIFICATE, RSA PRIVATE KEY, PUBLIC KEY) и снова пять дефисов. Пример: -----BEGIN CERTIFICATE-----.
  2. Тело (payload): Закодированные в Base64 двоичные данные, представляющие собой DER-кодировку (Distinguished Encoding Rules) соответствующей структуры ASN.1. Строки тела обычно разбиты на блоки по 64 символа для удобства чтения и обработки.
  3. Строка-концовка (postamble): Аналогична заголовку, но содержит слово END. Пример: -----END CERTIFICATE-----.

Между заголовком и концовкой могут присутствовать необязательные поля заголовка (RFC 1421), такие как Proc-Type, DEK-Info и другие, но в современном использовании (RFC 7468) они, как правило, опускаются.

Пример PEM-файла сертификата

`` -----BEGIN CERTIFICATE----- MIIDXTCCAkWgAwIBAgIJALr5f7HpR2F0MA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQwHhcNMjMwMTAxMDAwMDAwWhcNMjQwMTAxMDAwMDAwWjBF ... (ещё несколько десятков строк) ... -----END CERTIFICATE----- ``

Типы данных, хранимых в формате PEM

Формат PEM универсален и может содержать различные криптографические объекты. Наиболее распространённые типы, определённые в RFC 7468, включают:

  • CERTIFICATEсертификат X.509.
  • X509 CRLсписок отзыва сертификатов (CRL).
  • CERTIFICATE REQUEST — запрос на подпись сертификата (PKCS#10 CSR).
  • PRIVATE KEYзакрытый ключ в формате PKCS#8 (универсальный).
  • ENCRYPTED PRIVATE KEY — зашифрованный закрытый ключ PKCS#8.
  • RSA PRIVATE KEY — закрытый ключ RSA в формате PKCS#1 (устаревший, но всё ещё широко используется).
  • PUBLIC KEYоткрытый ключ (SubjectPublicKeyInfo) в формате X.509/SPKI.
  • RSA PUBLIC KEY — открытый ключ RSA в формате PKCS#1.
  • EC PRIVATE KEY — закрытый ключ для эллиптических кривых (SEC 1).
  • ATTRIBUTE CERTIFICATE — атрибутный сертификат.
  • CMS — криптографическое сообщение (Cryptographic Message Syntax).

Преимущества и недостатки

Преимущества

  • Человекочитаемость: Текстовый формат легко просматривать, копировать и передавать через текстовые каналы (электронная почта, системы контроля версий, веб-формы).
  • Интероперабельность: Поддерживается практически всеми библиотеками и инструментами для работы с криптографией (OpenSSL, GnuTLS, Java KeyStore, .NET, Python cryptography).
  • Простота обработки: Легко парсится скриптами и командной строкой (например, с помощью grep, sed или awk).
  • Возможность объединения: Несколько PEM-объектов могут быть последовательно записаны в один файл (например, цепочка сертификатов или связка ключа и сертификата).

Недостатки

  • Размер: За счёт кодировки Base64 размер файла примерно на 33% больше, чем у исходного двоичного DER-формата.
  • Отсутствие метаданных: Сам формат не содержит информации о том, какой именно ключ или сертификат находится внутри (например, дата истечения, владелец), без его полной расшифровки.
  • Проблемы с безопасностью при передаче: PEM не шифрует данные автоматически. Если файл содержит закрытый ключ, он уязвим при перехвате (хотя может быть дополнительно зашифрован паролем, что отражается в заголовке DEK-Info).

Применение

Формат PEM является основным для хранения и обмена криптографическими данными в следующих областях:

  • Веб-серверы (Apache, Nginx, IIS): Файлы сертификатов (fullchain.pem) и закрытых ключей (privkey.pem) для HTTPS.
  • Электронная почта (S/MIME): Хранение сертификатов и ключей пользователей.
  • Контейнеры и облачные технологии: Kubernetes, Docker, Terraform часто используют PEM для хранения TLS-сертификатов и ключей доступа.
  • VPN и сетевые протоколы: OpenVPN использует PEM для сертификатов и ключей клиентов и серверов.
  • Центры сертификации (CA): Выдача сертификатов и CRL в формате PEM.
  • Разработка программного обеспечения: Библиотеки, такие как OpenSSL, генерируют и читают ключи и сертификаты именно в этом формате.

Связь с другими форматами

  • DER (Distinguished Encoding Rules): Двоичный эквивалент PEM. PEM-файл — это DER-файл, закодированный в Base64 и обрамлённый заголовками. Преобразование между ними выполняется легко (например, с помощью команд openssl x509 -in cert.pem -outform DER -out cert.der).
  • PKCS#7 / P7B: Формат для хранения сертификатов и цепочек, часто используется в Windows. Может быть конвертирован в PEM.
  • PKCS#12 / PFX: Защищённый паролем контейнер для хранения сертификата вместе с закрытым ключом. Часто конвертируется в отдельные PEM-файлы для использования в Unix-системах.

Безопасность при работе с PEM

При работе с файлами PEM, содержащими закрытые ключи, необходимо соблюдать меры предосторожности:

  • Файлы с закрытыми ключами должны иметь ограниченные права доступа (например, chmod 600 в Linux).
  • Не рекомендуется передавать незашифрованные закрытые ключи по незащищённым каналам связи.
  • Для защиты ключа при хранении может использоваться шифрование с парольной фразой, что приводит к появлению заголовка -----BEGIN ENCRYPTED PRIVATE KEY-----.

Источники

  1. RFC 1421 — Privacy Enhancement for Internet Electronic Mail: Part I: Message Encryption and Authentication Procedures (1993).
  2. RFC 7468 — Textual Encodings of PKIX, PKCS, and CMS Structures (2015).
  3. OpenSSL документация: openssl(1) — команды преобразования форматов.
  4. Стандарт X.509 — ITU-T Recommendation X.509 (2019).
  5. Документация библиотеки cryptography для Python (раздел PEM).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →