openssl_x509_parse

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

openssl_x509_parse — Analyse un certificat X509 et retourne les informations sous forme de tableau

Description

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

openssl_x509_parse() retourne des informations sur le certificate fourni, notamment le nom du sujet, le nom de l'émetteur, les usages (purposes), les dates de début et de fin de validité, etc.

Liste de paramètres

certificate

Certificat X509. Voir paramètre de Clé/Certificat pour une liste de valeurs valides.

short_names

short_names contrôle l'indexation des données dans le tableau : si short_names vaut true (valeur par défaut), alors les champs seront indexés avec la forme courte des noms, sinon, les noms longs seront utilisés. (par exemple, CN est le nom court de commonName).

Valeurs de retour

Retourne un tableau contenant les champs du certificat en cas de succès, ou false si une erreur survient.

alias n'est présent que si le certificat possède un alias. Toutes les autres clés listées ci-dessous sont toujours présentes.

Tableau retourné par openssl_x509_parse()
Clé Type Description
name string Nom distinctif du sujet sous forme d'une seule chaîne, dont les composants sont séparés par des barres obliques. Par exemple, /C=US/O=Example/CN=example.com.
subject array Nom distinctif du sujet. Les clés sont des noms courts comme CN lorsque short_names vaut true, et des noms longs comme commonName sinon. Chaque valeur est une chaîne de caractères UTF-8, ou un tableau de chaîne de caractères UTF-8 lorsque ce composant apparaît plusieurs fois.
hash string Hachage hexadécimal en minuscules du nom du sujet, tel qu'utilisé pour rechercher un certificat dans un répertoire d'autorités de certification OpenSSL. Il s'agit d'une valeur de 8 chiffres. Ce n'est pas l'empreinte du certificat ; voir openssl_x509_fingerprint().
issuer array Nom distinctif de l'émetteur, sous la même forme que subject.
version int Champ de version brut stocké dans le certificat. Cette valeur est inférieure d'une unité à la version du certificat habituellement affichée : un certificat de version 1 vaut 0, un certificat de version 2 vaut 1, et un certificat de version 3 vaut 2.
serialNumber string Représentation décimale du numéro de série. Les numéros de série volumineux sont retournés à la place sous forme de chaîne hexadécimale préfixée par 0x.
serialNumberHex string Représentation hexadécimale en majuscules du numéro de série.
validFrom string Date de début de validité au format ASN.1, soit UTCTime (YYMMDDHHMMSSZ), soit GeneralizedTime (YYYYMMDDHHMMSSZ).
validTo string Date de fin de validité, sous la même forme que validFrom.
validFrom_time_t int Date de début de validité sous forme d'horodatage Unix, ou -1 si la date n'a pas pu être analysée.
validTo_time_t int Date de fin de validité sous forme d'horodatage Unix, ou -1 si la date n'a pas pu être analysée.
alias string Alias du certificat (nom convivial). Présent uniquement s'il est défini.
signatureTypeSN string Nom court de l'algorithme de signature.
signatureTypeLN string Nom long de l'algorithme de signature.
signatureTypeNID int Identifiant numérique de l'algorithme de signature (NID OpenSSL).
purposes array Vérifications des usages, indexées par identifiant d'usage. Les identifiants sont les constantes X509_PURPOSE_*. Chaque valeur est un tableau décrit ci-dessous.
extensions array Extensions du certificat, indexées par nom court (par exemple subjectAltName) ou par OID lorsque l'extension n'a pas de nom court. Chaque valeur est un texte décrivant cette extension, ou les données brutes de l'extension lorsqu'elles ne peuvent pas être affichées. Les clés présentes dépendent du certificat. Ce tableau ne suit pas short_names.

Chaque élément de purposes possède les clés suivantes :

Entrée d'usage
Clé Type Description
0 bool true si le certificat peut être utilisé pour cet usage en tant que certificat d'entité finale.
1 bool true si le certificat peut être utilisé pour cet usage en tant que certificat d'autorité de certification.
2 string Nom de l'usage. Un nom court comme sslclient lorsque short_names vaut true, et un nom long comme SSL client sinon.

Historique

Version Description
8.4.0 L'analyse d'un certificat sans secondes dans UTCTime n'est plus autorisée pour aucune version d'OpenSSL. Cela était déjà interdit pour OpenSSL version 3.3+.
8.0.0 certificate accepte désormais une instance de OpenSSLCertificate ; auparavant, une resource de type OpenSSL X.509 était acceptée.
+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));