文字

openssl_x509_parse

(PHP 4 >= 4.0.6, PHP 5)

openssl_x509_parseParse an X509 certificate and return the information as an array

说明

array openssl_x509_parse ( mixed $x509cert [, bool $shortnames = true ] )

openssl_x509_parse() returns information about the supplied x509cert, including fields such as subject name, issuer name, purposes, valid from and valid to dates etc.

参数

x509cert

shortnames

shortnames controls how the data is indexed in the array - if shortnames is TRUE (the default) then fields will be indexed with the short name form, otherwise, the long name form will be used - e.g.: CN is the shortname form of commonName.

返回值

The structure of the returned data is (deliberately) not yet documented, as it is still subject to change.

用户评论:

[#1] s dot stok at rollerscapes dot net [2009-12-28 05:03:28]

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

[#2] koukopoulos at gmail dot com [2008-03-17 05:22:42]

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


function asn1der_ia5string($str)
{
    
$len=strlen($str)-2;
    if (
$len && $len 127) {
        return 
false;
    }

    

    
if (22 != (ord($str[$pos++]) & 0x1f) && 
    
ord($str[$pos++]) != $len) {
    

    
return false;
    }

    return 
substr($str2,  $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
<?php
Array
(
    [
name] => /C=GR/O=SOMETHING/CN=ME/
    ...
    [
extensions] => Array
        (
            [
basicConstraints] => CA:FALSE
            
[keyUsage] => Digital SignatureNon RepudiationKey Encipherment
            
[extendedKeyUsage] => E-mail ProtectionTLS Web Client Authentication
            
[nsCertType] => SSL ClientS/MIME
            
....
?>

[#3] zioproto at gmail dot com [2008-02-13 06:43:42]

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));

[#4] nathanael at dihedral dot de [2006-08-11 06:02:26]

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
            )

    )

[#5] maarten at xolphin dot nl [2005-02-11 02:00:49]

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:

<?php
  
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.

[#6] smgallo at buffalo dot edu [2004-10-29 11:15:17]

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.  :)

上一篇: 下一篇: