¿Existe una norma y / o nombre oficial para los paquetes de certificados PEM?

8

Esta es una pregunta que no es realmente acerca de la seguridad propiamente dicha. Es sobre seguridad / nomenclatura criptográfica. Me ha estado molestando un poco, así que aquí va:

Conozco dos enfoques para agrupar certificados / claves relacionados:

  • Enfoque de peso pesado: PFX. Existe el formato de archivo PKCS # 12. Windows guarda estos archivos como .PFX o .P12 .
  • Enfoque de peso ligero: Just-cat-everything (también conocido como "paquete PEM"). Solo se ejecuta cat en todos los certificados / claves (en el orden deseado) y se redirige a un nuevo archivo de texto.

Pregunta

  • ¿Existe un estándar real para el enfoque del "paquete PEM"? ¿Se llama así o hay un nombre más oficial? (Cita por favor!)

Tenía la impresión de que esta es solo la forma ad hoc que OpenSSL usaba para manejar el conjunto de certificados / claves y se ha adoptado como un estándar de facto. ¿Es esto cierto? ¿O es que el enfoque "solo un gato-todo" es parte de los estándares PEM?

Encuesta de nomenclatura

¿Cómo llaman las personas a estos archivos de paquetes PEM?

pregunta StackzOfZtuff 24.07.2015 - 13:34
fuente

1 respuesta

6

No hay un estándar real para cosas en formato "PEM". Hubo un estándar propuesto llamado Correo electrónico con privacidad , desde el cual el "PEM se derivó el acrónimo; sin embargo, ese estándar nunca ganó fuerza contra su competencia (PGP y S / MIME) y nadie lo implementa.

OpenSSL seleccionó PEM y "mejoró" el formato de PEM con funcionalidades y encabezados adicionales, sin ninguna especificación o documentación real digna de ese nombre , de modo que hoy en día, "PEM" realmente significa "lo que OpenSSL produce y puede analizar". Otros proveedores siguieron, por ejemplo, Microsoft, cuyo software puede decodificar certificados codificados PEM.

El principio de PEM (datos codificados en Base64, con un encabezado '----- BEGIN XXX -----' y el correspondiente '----- END XXX --- - 'trailer' ha sido utilizado para otras cosas; PGP lo llama "armadura ASCII". El punto de esta forma de hacer las cosas es poder ubicar los datos interesantes dentro de una secuencia de datos de texto, independientemente de las diversas torturas infligidas a ese texto a medida que se transfiere (por ejemplo, se envía como correo electrónico, copia y pegado, incluido). En un documento de Word, impreso y escaneado ...). Este es un punto importante: significa que el punto entero de PEM es poder almacenar los certificados de forma conjunta y aleatoria sin tener que seguir un estándar específico y preciso. En ese sentido, un estándar para un "paquete PEM" sería una autocontradicción: un "paquete PEM" es lo que haces cuando no hay un estándar.

No es incorrecto llamarlo un "estándar de facto".

Cuando desea codificar y enviar certificados, de hecho hay más de dos métodos; las posibilidades incluyen:

  • Codifique cada certificado por separado, utilizando la codificación ASN.1 DER (que es estándar).
  • Use PEM para hacer que estos certificados sean más resistentes a la transferencia basada en ASCII; esto también permite almacenar varios de ellos en un solo archivo (lo que usted llama un "paquete PEM");
  • Almacene los certificados en un PKCS # 7 (también conocido como CMS ) SignedData object. Un SignedData es nominalmente un formato para incrustar datos que están firmados; pero puede omitir los datos e incluir exactamente la firma cero, en cuyo caso tiene algún tipo de shell que incluye un campo para insertar "certificados adicionales" (nominalmente, estos certificados están ahí para ayudar a validar las firmas). Esta es la reutilización de un estándar existente para algo que el estándar no estaba destinado a hacer, pero el software existente hace eso. Microsoft llama a eso un "certificado PKCS # 7" o un "archivo P7B".
  • Use un PKCS # 7 SignedData pero también codifíquelo con PEM (para que conceptualmente pueda almacenar varios de ellos en un solo archivo).
  • PKCS # 12 (también conocido como "PFX"). Este formato también permite almacenar otro tipo de objetos e incluye disposiciones para el cifrado basado en contraseñas, por lo que se suele utilizar para almacenar un certificado y su clave privada. (Al parecer, nadie pensó nunca en codificar PEM en un archivo PKCS # 12).

Las claves privadas también tienen sus propios formatos. Por ejemplo, PKCS # 1 define una codificación basada en ASN.1 para claves privadas RSA, que OpenSSL usará alegremente y luego Codifique PEM con un encabezado "BEGIN RSA PRIVATE KEY". Ese formato puede incluirse en un objeto PKCS # 8 , que incluye un identificador basado en ASN.1 para el algoritmo, y también soporte opcional de cifrado basado en contraseña; y luego , OpenSSL también codificará un archivo PKCS # 8, esta vez con "BEGIN PRIVATE KEY" o "BEGIN ENCRYPTED PRIVATE KEY" (no hay indicación del algoritmo en el Encabezado PEM), dependiendo de si se usó o no el cifrado basado en contraseña. Alternativamente, el formato PKCS # 1 sin procesar también puede estar cifrado con una contraseña, utilizando las extensiones a PEM que OpenSSL implementa pero no documenta (se supone que el código fuente de OpenSSL es la especificación).

Para resumir: es un desastre.

    
respondido por el Thomas Pornin 24.07.2015 - 15:23
fuente

Lea otras preguntas en las etiquetas