Один сертификат, много обёрток
Распространённый источник путаницы в том, что один сертификат может прийти как .crt, .cer, .pem, .der или погребённым внутри .pfx, и люди полагают, что это разные вещи. Обычно это не так. Сертификат — это одна фиксированная структура (раскладка .1, описанная в статье об анатомии); что меняется — это как эти байты закодированы и что ещё упаковано рядом с ними. Знание горстки реальных форматов заставляет файловые расширения перестать быть загадочными.
DER: канонический двоичный
В самом низу — , Distinguished Encoding Rules из ITU-T X.690. DER — это фактическая двоичная сериализация дерева ASN.1 сертификата: последовательность записей tag-length-value, ровно с одной допустимой кодировкой для любого данного значения. Этот детерминизм важен, потому что подпись издателя вычисляется над этими точными байтами. Файл .der (и часто файл .cer) — это сырой DER без текстовой обёртки. Инструмент X.509 декодирует этот двоичный напрямую.
PEM: DER, обёрнутый в текст
— это DER, который был закодирован в Base64 и обёрнут в строки брони, определённый RFC 7468:
-----BEGIN CERTIFICATE-----
MIIELDCCAxSgAwIBAgIG... (Base64 of the DER)
-----END CERTIFICATE-----
PEM существует, потому что двоичный не переживает вставку в email, файл конфигурации или терминал, тогда как текст Base64 переживает. Метка на строках BEGIN/END говорит вам, что есть тело, и их несколько:
CERTIFICATE— это сертификат X.509.CERTIFICATE REQUEST— это (см. статью о запросе подписи).PRIVATE KEY— это приватный ключ PKCS#8;RSA PRIVATE KEYиEC PRIVATE KEY— более старые ключ-специфичные форматы.PUBLIC KEY— это голый SubjectPublicKeyInfo.X509 CRL— это список отзыва сертификатов.
Один файл PEM может содержать несколько блоков подряд, что и есть способ, которым листовой сертификат сервера плюс его промежуточная цепочка отправляются в одном fullchain.pem. О кодировке под спудом см. статью о Base64.
Файловое расширение — не формат
Это та часть, что подставляет людям ножку: .crt, .cer, .pem и .key описывают намерение, а не кодировку. .crt может быть PEM или DER. .cer часто DER на Windows, но PEM в других местах. .key — это приватный ключ, но может быть PKCS#1, PKCS#8 или , в PEM или DER. Единственный надёжный способ узнать, что у вас есть, — посмотреть на первые байты: PEM начинается с видимой строки -----BEGIN, тогда как DER начинается с байта тега SEQUENCE 0x30. Инструмент принимает любой, так что вы можете вставить блок PEM или загрузить сырой DER, не конвертируя сначала.
Контейнеры, связывающие более одной вещи
Два формата PKCS упаковывают несколько объектов вместе:
- PKCS#7 (
.p7b,.p7c) несёт один или более сертификатов, обычно сертификат плюс его цепочку, но никакого приватного ключа. Часто используется, чтобы вручить кому-то полную цепочку в одном файле. - PKCS#12 (
.pfx,.p12), определённый RFC 7292, связывает сертификат, его цепочку и соответствующий приватный ключ в один защищённый паролем блоб. Это то, что вы экспортируете из хранилища сертификатов Windows или импортируете в балансировщик нагрузки, когда хотите, чтобы ключ и сертификат путешествовали вместе. Поскольку он содержит приватный ключ, файл PKCS#12 чувствителен, и пароль — единственное, что его защищает.
Кодировки приватных ключей
У приватных ключей свой маленький зоопарк. PKCS#1 (RSA PRIVATE KEY) — оригинальный формат только-. SEC1 (EC PRIVATE KEY) — эквивалент для ключей на эллиптических кривых. PKCS#8 (PRIVATE KEY, опционально ENCRYPTED PRIVATE KEY) — современная, нейтральная к алгоритму обёртка, которая может содержать любой, и это то, что выдаёт большинство современных инструментов. Декодировщику сертификатов никогда не нужен приватный ключ, и вам никогда не следует вставлять приватный ключ в инструмент, который вы не контролируете; инструмент X.509 — для сертификатов, которые публичны по замыслу.
Преобразование между ними
Поскольку внутренняя структура идентична, преобразование без потерь и рутинно. С OpenSSL, PEM в DER — это openssl x509 -in cert.pem -outform der -out cert.der, а обратное меняет местами формы in и out. Построить PKCS#12 из отдельного сертификата и ключа — это openssl pkcs12 -export -in cert.pem -inkey key.pem -out bundle.pfx. Ни одно из этих не меняет сам сертификат; они лишь переупаковывают его.
Упаковка, не суть
Вывод в том, что PEM против DER и .crt против .pfx — это вопросы транспорта и связывания, а не того, что сертификат говорит. Снимите броню, декодируйте из Base64 и игнорируйте контейнер, и под каждым из этих — то же самое подписанное заявление ASN.1, связывающее открытый ключ с именем. Задача инструмента — отшелушить эту упаковку в вашем браузере и показать вам структуру внутри, причём ни один файл никогда не покидает страницу.