Формат 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), который состоит из следующих обязательных элементов:
- Строка-заголовок (preamble): Начинается с пяти дефисов, за которыми следует слово
BEGIN, затем пробел, идентификатор типа данных (например,CERTIFICATE,RSA PRIVATE KEY,PUBLIC KEY) и снова пять дефисов. Пример:-----BEGIN CERTIFICATE-----. - Тело (payload): Закодированные в Base64 двоичные данные, представляющие собой DER-кодировку (Distinguished Encoding Rules) соответствующей структуры ASN.1. Строки тела обычно разбиты на блоки по 64 символа для удобства чтения и обработки.
- Строка-концовка (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-----.
Источники
- RFC 1421 — Privacy Enhancement for Internet Electronic Mail: Part I: Message Encryption and Authentication Procedures (1993).
- RFC 7468 — Textual Encodings of PKIX, PKCS, and CMS Structures (2015).
- OpenSSL документация:
openssl(1)— команды преобразования форматов. - Стандарт X.509 — ITU-T Recommendation X.509 (2019).
- Документация библиотеки
cryptographyдля Python (раздел PEM).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →