Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Часто полезно посмотреть на существующую реализацию и посмотреть, что они делают. OpenSSL/LibreSSL определяет эти маркеры BEGIN и END в crypto/pem/pem.h. Например, текущий LibreSSL имеет следующее:

#define PEM_STRING_X509_OLD "X509 CERTIFICATE"
#define PEM_STRING_X509     "CERTIFICATE"
#define PEM_STRING_X509_PAIR    "CERTIFICATE PAIR"
#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_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"

И насколько я знаю, нет основного списка маркеров BEGIN/END. Реализация в значительной степени определяется по мере необходимости. И затем, если вы хотите взаимодействовать с этой реализацией, вы добавляете строку в свою.

Ответ 2

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

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

Внутри вы найдете объект, закодированный в Base64, который вам нужно для декодирования Base64 в байтах. Эти байты представляют собой закодированный DER сертификат/ключ/etc. Я не уверен, какие хорошие библиотеки вы могли бы использовать для анализа данных 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

Ответ 3

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

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

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

    Запросы на сертификацию PKCS # 10 кодируются с использованием Надпись "СЕРТИФИКАТ ЗАПРОС". Закодированные данные ДОЛЖНЫ быть BER (DER сильно предпочтительнее; см. Приложение B), закодированные ASN.1 Структура CertificationRequest, как описано в [RFC2986].

----- НАЧАТЬ ЗАПРОС СЕРТИФИКАТА -----

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

----- ЗАВЕРШЕНИЕ КОНЦЕПЦИИ СЕРТИФИКАТА -----

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

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

Ответ 4

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

Как ответил indiv, полный список ключевых слов см. в файле заголовка OpenSSL crypto/pem/pem.h.

Ответ 5

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

Ответ 6

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

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

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

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