security - privada - pem certificate
¿Dónde se especifica el formato de archivo PEM? (6)
¿Dónde se especifica el formato de archivo PEM?
No hay un solo 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 proporcionara una lista como la que está pidiendo en el 2006. El grupo de trabajo rechazó. Ver solicitud de borrador de formato de archivo PEM rfc .
Necesito analizar los archivos .PEM.
Sé que el estándar para "Correo electrónico con privacidad mejorada" se define en las 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?
A menudo es beneficioso observar 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 hasta donde sé, no hay una lista maestra de marcadores BEGIN / 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.
Encontré un hilo viejo sobre este tema. Parece que no existe un formato estándar "oficial" para los límites de encapsulación, y la mejor manera de determinarlo es adivinando los contenidos en base a palabras clave conocidas que se encuentran en la instrucción BEGIN
.
Como lo respondió indiv, para obtener la lista completa de las palabras clave, consulte el archivo de encabezado crypto / pem / pem.h de OpenSSL.
No estoy seguro de si es específico de OpenSSL, pero la documentación para el formato de cifrado PEM puede ser lo que estás buscando.
Para empezar: hasta donde sé, si hay una parte que es legible por los humanos (tiene palabras y demás), está destinada a que los operadores humanos sepan cuál es la certificación en cuestión, las fechas de caducidad, etc., para una verificación manual rápida . 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 para comprender qué datos hay dentro de cada bloque, puede pegar lo que hay entre los bloques BEGIN-END en este sitio que realiza la decodificación ASN.1 en JavaScript:
Aunque no iba a pegar ningún entorno de producción de claves privadas a ningún sitio (aunque eso parece ser solo un 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
Respuesta actualizada para 2015 : como los usuarios ya han respondido dos veces, antes de que el moderador @royhowie eliminara las respuestas: ahora hay RFC 7468 que define los encabezados PEM . 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 .
Sin embargo, @royhowie borra todas las respuestas como ''solo enlace'' a menos que tenga algo de texto. Así que aquí hay un texto:
Codificación textual de la sintaxis de solicitud de certificación PKCS # 10
Las Solicitudes de Certificación PKCS # 10 están codificadas usando la etiqueta "SOLICITUD DE CERTIFICADO". Los datos codificados DEBEN ser una estructura de Solicitud de Certificación ASN.1 codificada en DER (DER fuertemente preferida, ver Apéndice B) como se describe en [RFC2986].
----- COMIENCE LA PETICIÓN DEL CERTIFICADO -----
ByqGSM49AgEGBSuBBAAhAzoABLLPSkuXY0l66MbxVJ3Mot5FCFuqQfn6dTs MIIBWDCCAQcCAQAwTjELMAkGA1UEBhMCU0UxJzAlBgNVBAoTHlNpbW9uIEpvc2Vm c3NvbiBEYXRha29uc3VsdCBBQjEWMBQGA1UEAxMNam9zZWZzc29uLm9yZzBOMBAG + 9 / CM EOlSwVej77tj56kj9R / j9Q + LfysX8FO9I5p3oGIwYAYJKoZIhvcNAQkOMVMwUTAY BgNVHREEETAPgg1qb3NlZnNzb24ub3JnMAwGA1UdEwEB / wQCMAAwDwYDVR0PAQH / BAUDAwegADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDATAKBggqhkjOPQQDAgM / ADA8 AhxBvfhxPFfbBbsE1NoFmCUczOFApEuQVUw3ZP69AhwWXk3dgSUsKnuwL5g / ftAY dEQc8B8jAcnuOrfU
----- SOLICITUD DE CERTIFICADO FINAL -----
Figura 9: Ejemplo de PKCS # 10
La etiqueta "NUEVA PETICIÓN DE CERTIFICADO" también tiene un amplio uso. 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".