В течение достаточно долгого времени не было формальной спецификации формата PEM в отношении криптографического обмена информацией.PEM - это текстовое кодирование, но то, что на самом деле кодируется, зависит от контекста.В апреле 2015 года IETF одобрил RFC 7468 , в котором, наконец, документируется, как различные реализации обмениваются данными с использованием текстовой кодировки PEM.В следующем списке, взятом непосредственно из RFC, описывается формат PEM, используемый для следующих сценариев:
- Сертификаты, списки отзыва сертификатов (CRL) и информационные структуры открытого ключа субъекта в Интернете X.509Профиль сертификата и список отзыва сертификатов (CRL) инфраструктуры открытого ключа [RFC5280] .
- PKCS # 10: Синтаксис запроса сертификации [RFC2986] .
- PKCS # 7: Синтаксис криптографических сообщений [RFC2315] .
- Синтаксис криптографических сообщений [RFC5652] .
- PKCS # 8: Закрытый ключСинтаксис информации [RFC5208] , переименован в Один асимметричный ключ в пакете асимметричного ключа [RFC5958] и Синтаксис информации секретного ключа в тех же документах.
- АтрибутСертификаты в профиле сертификата интернет-атрибута для авторизации [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"
Эти метки являются началом, но вам все еще нужно посмотреть, как реализация кодирует данные между метками,На все нет одного правильного ответа.