openssl_x509_parse

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

openssl_x509_parse — Analiza un certificado X509

Descripción

function openssl_x509_parse(OpenSSLCertificate|string $certificate, bool $short_names = true): array|false

openssl_x509_parse() analiza el certificado X509 certificate, y devuelve las informaciones contenidas en él, incluyendo el sujeto (subject), nombre (name), emisor (issuer name), fechas de inicio y fin (valid from date y valid to date), etc.

Parámetros

certificate

Certificado X509. Ver parámetro de Clave/Certificado para una lista de valores válidos.

short_names

short_names controla la indexación de los datos en el array: si short_names vale true (valor por omisión), entonces los campos serán indexados con la forma corta de los nombres, de lo contrario, se utilizarán los nombres largos. (por ejemplo, CN es el nombre corto de commonName).

Valores devueltos

Devuelve un array con los campos del certificado en caso de éxito, o false en caso de error.

alias solo está presente cuando el certificado tiene un alias. Todas las demás claves enumeradas a continuación siempre están presentes.

Array devuelto por openssl_x509_parse()
Clave Tipo Descripción
name string Nombre distinguido del sujeto como un único string, con los componentes separados por barras. Por ejemplo, /C=US/O=Example/CN=example.com.
subject array Nombre distinguido del sujeto. Las claves son nombres cortos como CN cuando short_names es true, y nombres largos como commonName en caso contrario. Cada valor es un string UTF-8, o un array de strings UTF-8 cuando ese componente aparece más de una vez.
hash string Hash hexadecimal en minúsculas del nombre del sujeto, tal como se utiliza para buscar un certificado en un directorio de CA de OpenSSL. Es un valor de 8 dígitos. No es la huella digital del certificado; véase openssl_x509_fingerprint().
issuer array Nombre distinguido del emisor, con la misma forma que subject.
version int Campo de versión sin procesar almacenado en el certificado. Este valor es una unidad menor que la versión del certificado que suele mostrarse: un certificado de versión 1 es 0, un certificado de versión 2 es 1, y un certificado de versión 3 es 2.
serialNumber string Representación decimal del número de serie. Los números de serie grandes se devuelven en su lugar como un string hexadecimal con el prefijo 0x.
serialNumberHex string Representación hexadecimal en mayúsculas del número de serie.
validFrom string Fecha de inicio de validez en formato ASN.1, ya sea UTCTime (YYMMDDHHMMSSZ) o GeneralizedTime (YYYYMMDDHHMMSSZ).
validTo string Fecha de fin de validez, con la misma forma que validFrom.
validFrom_time_t int Fecha de inicio de validez como timestamp Unix, o -1 si no se pudo analizar la fecha.
validTo_time_t int Fecha de fin de validez como timestamp Unix, o -1 si no se pudo analizar la fecha.
alias string Alias del certificado (nombre descriptivo). Solo está presente cuando se ha definido uno.
signatureTypeSN string Nombre corto del algoritmo de firma.
signatureTypeLN string Nombre largo del algoritmo de firma.
signatureTypeNID int Identificador numérico del algoritmo de firma (NID de OpenSSL).
purposes array Comprobaciones de propósito, indexadas por el identificador del propósito. Los identificadores son las constantes X509_PURPOSE_*. Cada valor es un array descrito a continuación.
extensions array Extensiones del certificado, indexadas por nombre corto (por ejemplo subjectAltName) o por OID cuando la extensión no tiene nombre corto. Cada valor es un texto que describe esa extensión, o los datos sin procesar de la extensión cuando no se pueden imprimir. Las claves presentes dependen del certificado. Este array no sigue a short_names.

Cada elemento de purposes tiene las siguientes claves:

Entrada de propósito
Clave Tipo Descripción
0 bool true si el certificado puede utilizarse para este propósito como certificado de entidad final.
1 bool true si el certificado puede utilizarse para este propósito como certificado de CA.
2 string Nombre del propósito. Un nombre corto como sslclient cuando short_names es true, y un nombre largo como SSL client en caso contrario.

Historial de cambios

Versión Descripción
8.4.0 El análisis de un certificado sin segundos en UTCTime ya no es permitido para ninguna versión de OpenSSL. Esto ya estaba prohibido para OpenSSL versión 3.3+.
8.0.0 certificate ahora acepta una instancia de OpenSSLCertificate; anteriormente, se aceptaba un resource de tipo OpenSSL X.509.
+add a note

User Contributed Notes 7 notes

up
10
nathanael at dihedral dot de
20 years ago
When dealing with the purposes of a x509 crt file
the output of openssl_x509_parse gives an array with following for the purposes:
each new array ([purposes][1], [purposes][2] for example) is a new purpose check
I compared this output with the output of the command
# openssl x509 -purpose -in <x509crt_file>
the result i got was that
[purposes][x][2] quite obviously is the name of the purpose checked 
[purposes][x][1] corresponds to the tested purpose (as named in [purposes][x][2]) acting as CA
[purposes][x][0] corresponds to the general availability of the purpose

[purposes] => Array
    (
        [1] => Array
            (
                [0] => 1
                [1] => 1
                [2] => sslclient
            )

        [2] => Array
            (
                [0] => 1
                [1] => 1
                [2] => sslserver
            )

        [3] => Array
            (
                [0] => 1
                [1] => 1
                [2] => nssslserver
            )

        [4] => Array
            (
                [0] => 1
                [1] => 1
                [2] => smimesign
            )

        [5] => Array
            (
                [0] => 1
                [1] => 1
                [2] => smimeencrypt
            )

        [6] => Array
            (
                [0] => 1
                [1] => 1
                [2] => crlsign
            )

        [7] => Array
            (
                [0] => 1
                [1] => 1
                [2] => any
            )

        [8] => Array
            (
                [0] => 1
                [1] => 1
                [2] => ocsphelper
            )

    )
up
4
maarten at xolphin dot nl
21 years ago
At this time very useful X509 oids (like streetAddress, postalCode and others) are missing. You can find a list of them at http://www.alvestrand.no/objectid/2.5.4.html, I hope they get included to openssl-x509-parse soon.

Until then you can get these oids anyway like this:

<?
  function getOID($OID, $ssl)
  {
    preg_match('/\/' . $OID  . '=([^\/]+)/', $ssl, $matches);
    return $matches[1];
  }

  $cert = file_get_contents('test.crt');
  $ssl = openssl_x509_parse($cert);
  $Address = getOID('2.5.4.9', $ssl['name']);
  $ZipCode = getOID('2.5.4.17', $ssl['name']);
  $Postbox = getOID('2.5.4.18', $ssl['name']);
?>

The parseCert function from the Horde framework can be usefull for this too.
up
1
Stilez
10 years ago
The valid from/to info is returned twice, in two different formats. They can be converted to normal datetime objects like this:

$x509_data = openssl_x509_parse($cert);
date_create_from_format('ymdHise', $x509_data['validFrom'])->format('c');
date_create( '@' .  $x509_data['validFrom_time_t'])->format('c');
/* these give the same result */

To get a human-readable format directly (or any other formatted string) instead of a datetime object, use this:

date_create_from_format('ymdHise', $x509_data['validFrom'])->format('c');
or
date_create( '@' .  $x509_data['validFrom_time_t'])->format('c');

The same applies to validTo and validTo_time_t
up
2
smgallo at buffalo dot edu
22 years ago
The identifier for the email portion of certificates in the name and subject array have changed since PHP4.  In PHP 4.3.0 the following array was returned (displayed my print_r())

[name] => /O=Grid/O=Globus/O=CCR Grid Portal/OU=Portal User/CN=Test User/Email=test@nospam.buffalo.edu
[subject] => Array
(
   [O] => Grid/O=Globus/O=CCR Grid Portal
   [OU] => Portal User
   [CN] => Test User
   [Email] => test@nospam.buffalo.edu
...

The result in PHP5 is (note Email -> emailAddress):

[name] => /O=Grid/O=Globus/O=CCR Grid Portal/OU=Portal User/CN=Test User/emailAddress=test@nospam.buffalo.edu
[subject] => Array
(
   [O] => Grid/O=Globus/O=CCR Grid Portal
   [OU] => Portal User
   [CN] => Test User
   [emailAddress] => test@nospam.buffalo.edu
...

Of course, the manual DOES say this could happen.  :)
up
2
koukopoulos at gmail dot com
18 years ago
Re: the previous note: support for the x509v3 extensions was added in PHP 5.2. Also in PHP5 prior to 5.2.4 the values of the x509v3 extensions were not decoded and were returned in the DER binary representation. Therefore in order to read the contents of the v3 extensions you have to parse the relevant ASN.1 structures yourself.

For example if one needs to read an IA5STRING value in a private extension with the OID 1.3.6.1.4.1.7782.3.3 one can do :

<?php

/* parse a DER encoded representation 
   of a IA5STRING of length < 127 */
function asn1der_ia5string($str)
{
    $len=strlen($str)-2;
    if ($len < 0 && $len > 127) {
        return false;
    }

    /* check tag and len */
    if (22 != (ord($str[$pos++]) & 0x1f) && 
    ord($str[$pos++]) != $len) {
    /* not a valid DER encoding of an IA5STRING */
    return false;
    }

    return substr($str, 2,  $len);
}
$cert = openssl_x509_parse($pemcert);
print (asn1der_ia5string($cert['extensions']['1.3.6.1.4.1.7782.3.3'])); // prints decoded ascii string

?>

In newer versions (>5.2.3) the extensions are returned in a 'readable format'. For example:

<?php print_r(openssl_x509_parse(...)); ?>
will result in
<?
Array
(
    [name] => /C=GR/O=SOMETHING/CN=ME/
    ...
    [extensions] => Array
        (
            [basicConstraints] => CA:FALSE
            [keyUsage] => Digital Signature, Non Repudiation, Key Encipherment
            [extendedKeyUsage] => E-mail Protection, TLS Web Client Authentication
            [nsCertType] => SSL Client, S/MIME
            ....
?>
up
0
s dot stok at rollerscapes dot net
16 years ago
Alternative subjects can read as extensions.

[extensions]
            [subjectAltName] => DNS:*.cacert.org, DNS:cacert.org, DNS:*.cacert.net, DNS:cacert.net, DNS:*.cacert.com, DNS:cacert.com
up
-4
zioproto at gmail dot com
18 years ago
To read an extension from a X.509 certificate, you can proceed like this if you know the OID

//Read the certificate from file
$cert = file_get_contents('test.crt');
$ssl = openssl_x509_parse($cert);

$ext_value =  $ssl['extensions']['1.2.3.4.5.6'];
echo $ext_value

--------------------------------

Because the $ssl array is not documented, you can easily see its contents like this:

  //To print out all the array!
  print_r(array_values($ssl)); 
  print_r(array_keys($ssl));