PEM (Privacy Enhanced Mail) — текстовый формат кодирования криптографических данных: ключей, сертификатов, цепочек сертификатов. Несмотря на название, с электронной почтой сегодня почти не связан — применяется как стандартный контейнер для хранения и передачи TLS-сертификатов и ключей на серверах.
Как устроен PEM-формат
PEM-файл — ASCII-текст с заголовком, содержимым в Base64 и нижним колонтитулом:
-----BEGIN CERTIFICATE-----
MIIBxTCCAW+gAwIBAgIJAP...
-----END CERTIFICATE-----
Содержимое между маркерами — бинарные данные DER (Distinguished Encoding Rules, ASN.1), закодированные в Base64. Типы маркеров: CERTIFICATE — сертификат X.509; CERTIFICATE REQUEST — CSR; PRIVATE KEY — PKCS#8 приватный ключ; RSA PRIVATE KEY — RSA-ключ в PKCS#1; EC PRIVATE KEY — ECC-ключ. Несколько сертификатов объединяются в один файл «цепочкой»: сертификат сайта + промежуточный CA + (опционально) корневой CA.
Nginx принимает bundle в директиве ssl_certificate /etc/ssl/fullchain.pem. Apache использует отдельные директивы: SSLCertificateFile (сертификат сайта) и SSLCertificateChainFile (промежуточные CA). Let's Encrypt через Certbot сохраняет файлы в /etc/letsencrypt/live/domain/: cert.pem (сертификат), chain.pem (цепочка CA), fullchain.pem (сертификат + цепочка), privkey.pem (приватный ключ).
PEM и смежные форматы
- DER (.der, .cer)
- Бинарный аналог PEM — те же данные ASN.1, но без Base64. Используется в Windows и некоторых Java-приложениях. Конвертация:
openssl x509 -inform DER -in cert.der -out cert.pem. - PKCS#12 (.p12, .pfx)
- Бинарный контейнер, объединяющий сертификат и приватный ключ с паролем. Используется в Windows/IIS и iOS-профилях. Конвертация из PEM:
openssl pkcs12 -export -in cert.pem -inkey key.pem -out bundle.p12. - PKCS#7 (.p7b, .p7c)
- Контейнер только для сертификатов (без ключа). Используется в Windows для импорта цепочек. Может быть Base64 или DER.
- CRT / CER
- Расширения без строгого формата — могут содержать PEM или DER в зависимости от системы.
История
PEM разработан в рамках стандарта Privacy Enhanced Mail (RFC 1421–1424, 1993) для защиты электронной почты в ARPANET. Сам стандарт почтового шифрования не получил широкого распространения (его заменил S/MIME), но текстовый формат контейнера оказался удобным и был принят для TLS-сертификатов. DER как бинарный формат ASN.1 стандартизирован в ITU-T X.690. OpenSSL использует PEM как основной формат с ранних версий 1998 года.
Практическое использование PEM
Конвертация через OpenSSL: DER → PEM: openssl x509 -inform DER -in cert.der -out cert.pem; PEM → PKCS#12: openssl pkcs12 -export -in cert.pem -inkey key.pem -out bundle.p12; PKCS#12 → PEM: openssl pkcs12 -in bundle.p12 -nodes -out all.pem. Проверить содержимое: openssl x509 -in cert.pem -text -noout — выводит Subject, Issuer, сроки, SAN, алгоритм. Проверить соответствие сертификата и ключа: openssl x509 -modulus -in cert.pem | md5sum и openssl rsa -modulus -in key.pem | md5sum — хэши должны совпасть.
На что обращать внимание
Права доступа к файлу приватного ключа: chmod 600 privkey.pem — только владелец. Веб-сервер (Nginx, Apache) должен запускаться от имени пользователя с доступом к ключу. Не храните приватные ключи в публичных git-репозиториях — даже удалённый коммит остаётся в истории. Инструменты сканирования (truffleHog, GitLeaks) обнаруживают утечки ключей в репозиториях. Для VDS с Let's Encrypt проверяйте, что cron-задача или systemd-timer обновляет сертификат до истечения 90-дневного срока. Certbot автоматически обновляет при сроке менее 30 дней: certbot renew --quiet.