2011-03-18 24 views
38

Necesito analizar archivos .PEM.
Sé que el estándar para "Correo electrónico con privacidad mejorada" se define en los RFC 1421-24. Pero parece que no mencionan ningún texto que encuentre dentro de los archivos .pem de OpenSSL (por ejemplo, "Atributos clave", "BEGIN CERTIFICATE", etc ...) ¿Es este un formato específico de OpenSSL?¿Dónde se especifica el formato de archivo PEM?

+10

Tiene razón, no es un estándar real. Cuando el proyecto SSLeay (más tarde se convirtió en el proyecto openssl) necesitaba una forma de codificar ASCII varios archivos de claves públicas y privadas, se inspiraron en las PEM RFC que citan y llamaron al resultado un archivo PEM por falta de un mejor nombre. Ahora se refiere a casi cualquier cosa base64 codificada y envuelta con las líneas BEGIN y END. –

+1

Su respuesta debe publicarse por separado como una respuesta. –

+4

Se define en [RFC7468] (http://tools.ietf.org/html/rfc7468). – jariq

Respuesta

21

A menudo es beneficioso para mirar a una implementación existente y ver lo que hacen. OpenSSL/LibreSSL define estos marcadores BEGIN y END en crypto/pem/pem.h. Por ejemplo, el LibreSSL actual tiene lo siguiente:

#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" 

Y por lo que yo sé, no hay una lista maestra de marcadores COMENZAR/END. La implementación los define según sea necesario. Y luego, si desea interoperar con esa implementación, agregue la cadena a la suya.

+0

gracias! muy útil de hecho. esta es la lista más completa que he visto ... – hopia

2

No estoy seguro de si es específico de OpenSSL, pero la documentación para PEM Encryption Format puede ser lo que estás buscando.

+1

Gracias, pero estaba buscando información más completa sobre qué otras declaraciones BEGIN-END se están utilizando, como "BEGIN CERTIFICATE" y "BEGIN PRIVATE KEY". – hopia

+0

Fyi el enlace está desactivado. –

13

Para empezar: hasta donde sé, si hay una parte que sea legible por el ser humano (tiene palabras y demás), eso significa que los operadores humanos deben saber cuál es la certificación en cuestión, fechas de caducidad, etc. una rápida verificación manual. Entonces puedes ignorar eso.

Querrá analizar lo que hay entre los bloques BEGIN-END.

En el interior, encontrará una entidad codificada en Base64 que necesita para decodificar Base64 en bytes. Estos bytes representan un certificado/clave codificada DER/etc. No estoy seguro de qué buenas bibliotecas podrías usar para analizar los datos DER.

Como prueba de entender qué datos está dentro de cada bloque, se puede pegar lo que hay entre los bloques begin-end a este sitio que hace la descodificación ASN.1 en JavaScript:

http://lapo.it/asn1js/

A pesar de que wouldn No pegarás las claves privadas de ningún entorno de producción en ningún sitio (aunque parece ser solo un javascript).

Base 64: 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

+0

Es posible que haya malinterpretado un poco el enfoque de la pregunta :) –

+2

Gracias por la respuesta. Eso está bien.Esta información será útil para quien quiera analizar archivos PEM. – hopia

8

Encontré un old thread con respecto a este problema. Parece que no hay un formato estándar "oficial" para los límites de la encapsulación, y la mejor forma de determinarlo es adivinando los contenidos en base a palabras clave bien conocidas que se encuentran en la declaración BEGIN.

Respondido por indiv, para la lista completa de las palabras clave, consulte el archivo de encabezado crypto/pem/pem.h de OpenSSL.

0

¿Dónde se especifica el formato de archivo PEM?

No hay un lugar. Depende del estándar. Incluso puede crear sus propios límites de encapsulación y usarlos en su propio software.

Como @indiv declaró, OpenSSL tiene una lista bastante completa en <openssl dir>/crypto/pem/pem.h.

Alguien le pidió al Grupo de Trabajo de PKIX que le proporcione una lista como la que está solicitando en 2006. El grupo de trabajo rechazó. Ver PEM file format rfc draft request.

12

Respuesta actualizada para 2015: Como los usuarios ya han respondido dos veces, antes del moderador @royhowie borraron las respuestas: ahora hay RFC 7468 which defines the PEM headers. La siguiente cita es solo una pequeña parte, y debe leer la especificación real, que probablemente permanecerá en Internet mucho más tiempo que StackOverflow.

Sin embargo @royhowie borra todas las respuestas como 'solo el enlace' a menos que tenga algo de texto. Así que aquí es un texto:

  1. Pruebas de codificación de PKCS Solicitud # 10 Certificación Sintaxis

    PKCS # 10 Las solicitudes de certificación se codifican utilizando la etiqueta "CERTIFICADO DE SOLICITUD" . Los datos codificados DEBEN ser una BER (DER muy recomendable, véase el Apéndice B) con la codificación de la estructura de petición de certificación ASN.1 tal como se describe en [RFC2986].

----- BEGIN CERTIFICATE REQUEST -----

MIIBWDCCAQcCAQAwTjELMAkGA1UEBhMCU0UxJzAlBgNVBAoTHlNpbW9uIEpvc2Vm c3NvbiBEYXRha29uc3VsdCBBQjEWMBQGA1UEAxMNam9zZWZzc29uLm9yZzBOMBAG ByqGSM49AgEGBSuBBAAhAzoABLLPSkuXY0l66MbxVJ3Mot5FCFuqQfn6dTs + 9/CM EOlSwVej77tj56kj9R/j9Q + LfysX8FO9I5p3oGIwYAYJKoZIhvcNAQkOMVMwUTAY BgNVHREEETAPgg1qb3NlZnNzb24ub3JnMAwGA1UdEwEB/wQCMAAwDwYDVR0PAQH/ BAUDAwegADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDATAKBggqhkjOPQQDAgM/ADA8 AhxBvfhxPFfbBbsE1NoFmCUczOFApEuQVUw3ZP69AhwWXk3dgSUsK nuwL5g/ftAY dEQc8B8jAcnuOrfU

----- END CERTIFICATE REQUEST -----

Figura 9: PKCS # 10 Ejemplo

La etiqueta "Solicitar un nuevo certificado" también es de uso generalizado. Los generadores que cumplen con este documento DEBEN generar etiquetas de "SOLICITUD DE CERTIFICADO" . Parsers PUEDE tratar "SOLICITUD DE NUEVO CERTIFICADO" como equivalente a "SOLICITUD DE CERTIFICADO".^

Cuestiones relacionadas