¿Dónde está el número de versión en un certificado x509 versión 1?

2

Estoy analizando x509, versiones 1 y 3. Encontré el campo de versión en el certificado v3, pero tengo dos certificados v1 (uno de mi organización, uno que generé a través de OpenSSL) y en ambos el primero no El campo de secuencia es el número entero de serie:

    > openssl asn1parse -in ca.der -inform DER
    0:d=0  hl=4 l= 645 cons: SEQUENCE          
    4:d=1  hl=4 l= 494 cons: SEQUENCE          
    8:d=2  hl=2 l=   9 prim: INTEGER           :B7D50AE5F7DB09FD
    .
    .
    .

La razón por la que estoy confundido es que la redacción en RFC 1422 parece sugerir claramente que la versión es una campo real y que es el primer campo, antes del número de serie:

  3.3  Certificate Definition

   Certificates are central to the key management architecture for X.509
   and PEM.  This section provides an overview of the syntax and a
   description of the semantics of certificates.  Appendix A includes
   the ASN.1 syntax for certificates.   A certificate includes the
   following contents:

       1.  version

       2.  serial number

       3.  signature (algorithm ID and parameters)

       4.  issuer name

       5.  validity period

       6.  subject name

       7.  subject public key (and associated algorithm ID)

   3.3.1  Version Number

   The version number field is intended to facilitate orderly changes in
   certificate formats over time.  The initial version number for
   certificates used in PEM is the X.509 default which has a value of
   zero (0), indicating the 1988 version.  PEM implementations are
   encouraged to accept later versions as they are endorsed by
   CCITT/ISO.
   .
   .
   .

Estoy viendo el RFC 1422 porque wikipedia dice:

  

"La estructura de la versión 1 se encuentra en RFC 1422."

Mi expectativa es encontrar un campo entero de longitud 1 con el valor 0x00 antes del número de serie en un certificado v1.

¿Es la versión 0x00 (v1) simplemente implícita? Es decir, solo habrá un campo de versión si la versión > 0x00? ¿Qué significa esto para la descripción del campo de versión en RFC?

    
pregunta Wilbur Whateley 07.09.2016 - 21:13
fuente

2 respuestas

4

Respuesta corta: El RFC (1422) mencionado por Wikipedia no es correcto. No solo se menciona el formato en un RFC anterior (1114), sino que RFC hace referencia correctamente al documento de la UIT que tiene la descripción original: la versión 11/1988 del X.509, disponible aquí . En la sección 8.7 (c) de ese documento, se afirma que "si el valor de un tipo es su valor predeterminado, estará ausente". Por lo tanto, un certificado de la versión 1 es la versión predeterminada y no debe incluirse en el certificado firmado.

Respuesta más larga, con un poco de explicación:

La especificación X.509 más reciente (que no está en un RFC, pero el documento de la UIT no está disponible gratuitamente) que se relaciona con los certificados de clave pública se documenta más recientemente en RFC 5280. Aquí hay una parte de la sección 4.1, que cubre la Codificación ASN.1:

Certificate  ::=  SEQUENCE  {
    tbsCertificate       TBSCertificate,
    signatureAlgorithm   AlgorithmIdentifier,
    signatureValue       BIT STRING  }

TBSCertificate  ::=  SEQUENCE  {
    version         [0]  EXPLICIT Version DEFAULT v1,
    serialNumber         CertificateSerialNumber,
    signature            AlgorithmIdentifier,
    issuer               Name,
    validity             Validity,
    subject              Name,
    subjectPublicKeyInfo SubjectPublicKeyInfo,
    issuerUniqueID  [1]  IMPLICIT UniqueIdentifier OPTIONAL,
                         -- If present, version MUST be v2 or v3
    subjectUniqueID [2]  IMPLICIT UniqueIdentifier OPTIONAL,
                         -- If present, version MUST be v2 or v3
    extensions      [3]  EXPLICIT Extensions OPTIONAL
                         -- If present, version MUST be v3
    }

Version  ::=  INTEGER  {  v1(0), v2(1), v3(2)  }

Dos partes de esta notación que se refieren explícitamente al control de versiones son la etiqueta de la versión en sí misma y las secciones issuerUniqueID, subjectUniqueID y extensiones. La etiqueta de versión dice que el valor predeterminado es v1, y la especificación original dice que los valores predeterminados deben estar ausentes. Cuando las revisiones posteriores de X.509 agregaron versiones, esas nuevas versiones dejaron de ser predeterminadas y aparecieron en el certificado firmado.

Aunque puede utilizar esta especificación más reciente para generar un certificado de clave de pub versión 1, realmente no hay necesidad. Puede etiquetar un nuevo certificado con la etiqueta de la versión 3 (usando el número entero 2), y simplemente elegir no usar ninguna de las nuevas secciones.

La nueva especificación es compatible hacia atrás con el original. ASN.1 se utiliza para la codificación en todas estas revisiones de certificados. La ASN.1 es muy compacta, y se basa principalmente en el formato definido de una estructura para determinar qué significa cualquier campo dado. Es decir, lo que ve con toda la sintaxis "::=" es una definición que sigue cuando analiza el blob de datos que obtiene. El primer campo listado en la secuencia de TBSCertificate es la versión, que es un número entero. El siguiente campo es el número de serie, que también es un número entero. Si falta el campo de versión, que puede ser si el certificado es una versión 1, puede ser realmente difícil saber que el número de serie no es la versión. (Es posible, y es probable, con los certificados CA) que el número de serie sea un número de un solo dígito. La forma de evitar esto, que se utiliza en la especificación que se muestra aquí, es usar el etiquetado DER. Si la etiqueta de la versión está presente, se etiqueta utilizando la etiqueta DER "[0]". El número de serie no está etiquetado, por lo que si encuentra un número entero sin una etiqueta DER, sabrá que es probablemente un certificado de la versión 1. (También es posible que tenga un certificado con formato incorrecto; mire suficientes certificados y encontrará todo tipo de errores de formato ASN.1).

Los certificados de la versión 1 no tienen ninguna de las otras secciones marcadas con etiquetas DER, pero los certificados de la versión 3 (la versión que encontrará con más frecuencia en Internet) tampoco tienen que incluir ninguna o todas esas secciones. Para saber cuál de las secciones, si las hay, están presentes, mire las etiquetas DER. La mayoría de los certificados de la versión 3 tendrán extensiones, pero no issuerUniqueID o subjectUniqueID. En esos certificados, verá la etiqueta [0] para la versión, 1 y [2] para IDs únicos de sujeto y emisor, y etiqueta [3] para extensiones. Muchos de los certificados de versión 3 que encuentra no tienen secciones de ID únicos, por lo que la etiqueta [3] que sigue inmediatamente a subjectPublicKeyInfo es la indicación de que las extensiones están junto a las que se analizarán.

No encontrarás muchos certificados de la versión 2. Debido a que X.509 y ASN.1 no son lo suficientemente confusos, existe una especificación X.509 para los certificados de "atributo", un tipo diferente de certificado que no contiene una clave pública y sigue un formato diferente (con campos similares en un orden diferente) - que siempre están etiquetados como versión 2 por definición. Consulte RFC 5755 para obtener más información y el formato para certificados de atributos.

    
respondido por el Lampshade 13.06.2017 - 21:09
fuente
4

Si nos fijamos en el módulo ASN:

Certificate ::= SIGNED SEQUENCE{
           version [0]     Version DEFAULT v1988,
           serialNumber    CertificateSerialNumber,
           signature       AlgorithmIdentifier,
           issuer          Name,
           validity        Validity,
           subject         Name,
           subjectPublicKeyInfo    SubjectPublicKeyInfo}
Version ::=     INTEGER {v1988(0)}

está marcado con la palabra clave DEFAULT que indica que el campo puede estar presente o ausente (opcional). Se asume un valor predeterminado (cero en un caso determinado) si el archivo está ausente.

si escribe su propio decodificador, debe esperar el campo Version en la estructura y manejar correctamente la ausencia del campo al afirmar el valor predeterminado.

    
respondido por el Crypt32 07.09.2016 - 21:46
fuente

Lea otras preguntas en las etiquetas