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?
Respuesta
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.
gracias! muy útil de hecho. esta es la lista más completa que he visto ... – hopia
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.
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
Fyi el enlace está desactivado. –
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:
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
Es posible que haya malinterpretado un poco el enfoque de la pregunta :) –
Gracias por la respuesta. Eso está bien.Esta información será útil para quien quiera analizar archivos PEM. – hopia
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.
¿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.
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:
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".^
- 1. En WiX, ¿dónde se especifica el Código de producto?
- 2. Asociatividad C99 para operadores: ¿dónde se especifica?
- 3. cómo puedo verificar si el archivo de certificado que tengo está en formato .pem
- 4. Creando archivo .pem para APNS?
- 5. ¿Cómo se especifica el icono de py2app?
- 6. ¿Dónde y cómo se especifica la variable _ (guión bajo)?
- 7. ¿Cómo podemos convertir una cadena de PEM a Der formato
- 8. Cómo convertir la clave privada PEM PKCS con formato 8 al formato tradicional?
- 9. Convierta una cadena con formato PEM a java.security.cert.X509Certificate
- 10. Mercurial: determine dónde se eliminó el archivo.
- 11. ¿Dónde se ha ido el archivo Smalltalk?
- 12. ¿Cómo puedo obtener SecKeyRef desde el archivo DER/PEM
- 13. ¿El archivo .pem contiene claves privadas y públicas?
- 14. ¿Dónde se monta un archivo?
- 15. Advertencia de compilador de formato Unicode: el formato especifica el tipo 'unsigned short' pero el argumento tiene el tipo 'int'
- 16. printf especifica cadena de formato de número entero de flotación
- 17. ¿Cómo se especifica RPATH en un archivo MAKE?
- 18. ¿Cómo convierto una clave XML RSA en un archivo PEM?
- 19. Convertir clave asimétrica DSA en formato XML .NET a formato PEM
- 20. Creando el certificado google oauth X.509 en formato PEM dentro de Mac OS X
- 21. ¿Cómo se llama este formato de archivo
- 22. ¿dónde se encuentra el archivo de configuración de NetBeans (netbeans.conf)?
- 23. ¿Cómo se especifica el nombre en el correo de Django?
- 24. ¿Dónde se copia el archivo MSI después de la instalación?
- 25. ¿Dónde y cómo se vincula el archivo de diseño _ViewStart.cshtml?
- 26. ¿Dónde se obtiene el archivo de encabezado/fuente "sys/socket.h"?
- 27. En ANTLR, ¿cómo se especifica un número específico de repeticiones?
- 28. ¿Cómo se especifica el archivo de entrada para un corredor de Python?
- 29. Resourcemanager está devolviendo el mismo recurso, aunque se especifica CultureInfo
- 30. dónde está el archivo '' itertools
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. –
Su respuesta debe publicarse por separado como una respuesta. –
Se define en [RFC7468] (http://tools.ietf.org/html/rfc7468). – jariq