Где указан формат файла PEM? - PullRequest
43 голосов
/ 18 марта 2011

Мне нужно проанализировать файлы .PEM.
Я знаю, что стандарт для «Электронной почты с повышенной конфиденциальностью» определен в RFC 1421-24.Но они, кажется, не упоминают какой-то текст, который я нахожу в файлах OpenSSL .pem (например, «Ключевые атрибуты», «НАЧАТЬ СЕРТИФИКАТ» и т. Д.). Это формат OpenSSL?

Ответы [ 6 ]

24 голосов
/ 18 марта 2011

В течение достаточно долгого времени не было формальной спецификации формата PEM в отношении криптографического обмена информацией.PEM - это текстовое кодирование, но то, что на самом деле кодируется, зависит от контекста.В апреле 2015 года IETF одобрил RFC 7468 , в котором, наконец, документируется, как различные реализации обмениваются данными с использованием текстовой кодировки PEM.В следующем списке, взятом непосредственно из RFC, описывается формат PEM, используемый для следующих сценариев:

  1. Сертификаты, списки отзыва сертификатов (CRL) и информационные структуры открытого ключа субъекта в Интернете X.509Профиль сертификата и список отзыва сертификатов (CRL) инфраструктуры открытого ключа [RFC5280] .
  2. PKCS # 10: Синтаксис запроса сертификации [RFC2986] .
  3. PKCS # 7: Синтаксис криптографических сообщений [RFC2315] .
  4. Синтаксис криптографических сообщений [RFC5652] .
  5. PKCS # 8: Закрытый ключСинтаксис информации [RFC5208] , переименован в Один асимметричный ключ в пакете асимметричного ключа [RFC5958] и Синтаксис информации секретного ключа в тех же документах.
  6. АтрибутСертификаты в профиле сертификата интернет-атрибута для авторизации [RFC5755] .

В соответствии с этим RFC, для вышеуказанных сценариев вы можете ожидать следующую меткудолжно быть в заголовке BEGIN и нижнем колонтитуле END .Рисунок 4 RFC содержит более подробную информацию, включая соответствующие типы ASN.1.

Хотя это еще не все.RFC был написан с учетом существующих реализаций и документирования того, что они сделали.RFC не был написан первым и не был написан на основе какой-либо существующей авторитетной документации.Поэтому, если вы окажетесь в ситуации, когда вы захотите взаимодействовать с какой-либо реализацией, вам, возможно, придется изучить исходный код реализации, чтобы выяснить, что они поддерживают.

Например, OpenSSL определяет эти BEGIN иКонечные маркеры в crypto / pem / pem.h .Вот выдержка из файла заголовка со всеми поддерживаемыми ими метками BEGIN и END.

# define PEM_STRING_X509_OLD     "X509 CERTIFICATE"
# define PEM_STRING_X509         "CERTIFICATE"
# define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE"
# define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST"
# define PEM_STRING_X509_REQ     "CERTIFICATE REQUEST"
# define PEM_STRING_X509_CRL     "X509 CRL"
# define PEM_STRING_EVP_PKEY     "ANY PRIVATE KEY"
# define PEM_STRING_PUBLIC       "PUBLIC KEY"
# define PEM_STRING_RSA          "RSA PRIVATE KEY"
# define PEM_STRING_RSA_PUBLIC   "RSA PUBLIC KEY"
# define PEM_STRING_DSA          "DSA PRIVATE KEY"
# define PEM_STRING_DSA_PUBLIC   "DSA PUBLIC KEY"
# define PEM_STRING_PKCS7        "PKCS7"
# define PEM_STRING_PKCS7_SIGNED "PKCS #7 SIGNED DATA"
# define PEM_STRING_PKCS8        "ENCRYPTED PRIVATE KEY"
# define PEM_STRING_PKCS8INF     "PRIVATE KEY"
# define PEM_STRING_DHPARAMS     "DH PARAMETERS"
# define PEM_STRING_DHXPARAMS    "X9.42 DH PARAMETERS"
# define PEM_STRING_SSL_SESSION  "SSL SESSION PARAMETERS"
# define PEM_STRING_DSAPARAMS    "DSA PARAMETERS"
# define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY"
# define PEM_STRING_ECPARAMETERS "EC PARAMETERS"
# define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY"
# define PEM_STRING_PARAMETERS   "PARAMETERS"
# define PEM_STRING_CMS          "CMS"

Эти метки являются началом, но вам все еще нужно посмотреть, как реализация кодирует данные между метками,На все нет одного правильного ответа.

20 голосов
/ 06 июля 2015

Обновленный ответ за 2015 год : поскольку пользователи уже ответили дважды, до того, как модератор @royhowie удалил ответы: теперь существует RFC 7468, который определяет заголовки PEM .Следующая цитата - только небольшая часть, и вы должны прочитать фактическую спецификацию, которая, вероятно, останется в Интернете гораздо дольше, чем StackOverflow.

Однако @royhowie удаляет каждый ответ, который указывает на RFC как «только ссылка», если у него нет текста.Итак, вот текст:

Текстовое кодирование синтаксиса запроса сертификации PKCS # 10

Запросы сертификации PKCS # 10 кодируются с использованием метки «CERTIFICATE REQUEST».Закодированные данные ДОЛЖНЫ быть BER (строго предпочтительным DER; см. Приложение B), а также закодированной структурой ASN.1 CertificationRequest, как описано в [RFC2986].----

MIIBWDCCAQcCAQAwTjELMAkGA1UEBhMCU0UxJzAlBgNVBAoTHlNpbW9uIEpvc2Vm c3NvbiBEYXRha29uc3VsdCBBQjEWMBQGA1UEAxMNam9zZWZzc29uLm9yZzBOMBAG ByqGSM49AgEGBSuBBAAhAzoABLLPSkuXY0l66MbxVJ3Mot5FCFuqQfn6dTs + 9 / СМ EOlSwVej77tj56kj9R / j9Q + LfysX8FO9I5p3oGIwYAYJKoZIhvcNAQkOMVMwUTAY BgNVHREEETAPgg1qb3NlZnNzb24ub3JnMAwGA1UdEwEB / wQCMAAwDwYDVR0PAQH / BAUDAwegADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDATAKBggqhkjOPQQDAgM / ADA8 AhxBvfhxPFfbBbsE1NoFmCUczOFApEuQVUw3ZP69AhwWXk3dgSUsKnuwL5g / ftAY dEQc8B8jAcnuOrfU

----- END CERTIFICATE ЗАПРОС ----

Рисунок 9: Пример PKCS # 10

Метка «НОВЫЙ ЗАПРОС СЕРТИФИКАТА» также широко используется.Генераторы, соответствующие этому документу, ДОЛЖНЫ генерировать метки «СЕРТИФИКАТ ЗАПРОС».Парсеры МОГУТ трактовать «НОВЫЙ ЗАПРОС СЕРТИФИКАТА» как эквивалент «ЗАПРОСА СЕРТИФИКАТА». ^

13 голосов
/ 18 марта 2011

Для начала: насколько я знаю, если есть часть, которая читается человеком (имеет слова и прочее), это предназначено для того, чтобы люди-операторы знали, что такое рассматриваемая сертификация, даты истечения срока действия и т. Д., Длябыстрая ручная проверка.Таким образом, вы можете игнорировать это.

Вы захотите проанализировать, что находится между блоками BEGIN-END.

Внутри вы найдете закодированную сущность Base64, необходимую для декодирования Base64 в байты.,Эти байты представляют собой кодированный ключ DER / ключ / и т. Д.Я не уверен, какие хорошие библиотеки вы могли бы использовать для анализа данных DER.

В качестве теста, чтобы понять, какие данные находятся внутри каждого блока, вы можете вставить то, что находится между блоками BEGIN-END, на этот сайт, который делаетДекодирование ASN.1 в JavaScript:

http://lapo.it/asn1js/

Хотя я бы не стал вставлять закрытые ключи какой-либо производственной среды в какой-либо сайт (хотя это кажется просто javascript).

Base64: http://en.wikipedia.org/wiki/Base64

DER: http://en.wikipedia.org/wiki/Distinguished_Encoding_Rules

ASN.1: http://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One

8 голосов
/ 21 марта 2011

Я нашел старую ветку относительно этой проблемы.Похоже, что нет «официального» стандартного формата для границ инкапсуляции, и лучший способ определить это - угадать содержимое на основе хорошо известных ключевых слов, которые вы найдете в операторе BEGIN.

.Для получения полного списка ключевых слов обратитесь к заголовочному файлу OpenSSL crypto / pem / pem.h.

2 голосов
/ 18 марта 2011

Я не уверен, относится ли он к OpenSSL, но документация для Формат шифрования PEM может быть тем, что вы ищете.

0 голосов
/ 19 апреля 2015

Где указан формат файла PEM?

Нет единого места.Это зависит от стандарта.Вы даже можете создать свои собственные границы инкапсуляции и использовать их в своем программном обеспечении.

Как сказал @indiv, у OpenSSL есть довольно полный список на <openssl dir>/crypto/pem/pem.h.

Кто-то спросил у PKIX WorkingГруппа предоставит список, который вы запрашиваете еще в 2006 году. Рабочая группа отказалась.См. Формат файла PEM rfc черновой запрос .

...