PHPのお勉強!

PHP TOP

openssl_x509_read

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

openssl_x509_readX.509 証明書をパースし、オブジェクトを返す

説明

openssl_x509_read(OpenSSLCertificate|string $certificate): OpenSSLCertificate|false

openssl_x509_read() は、 certificate で指定した証明書をパースし、 その証明書用の OpenSSLCertificate オブジェクトを返します。

パラメータ

certificate

X509 証明書。有効な値の一覧は、 Key/Certificate parameters を参照ください。

戻り値

成功した場合に OpenSSLCertificate オブジェクトを返します。 失敗した場合に false を返します

変更履歴

バージョン 説明
8.0.0 成功した場合に、この関数は OpenSSLCertificate クラスのインスタンスを返すようになりました。 これより前のバージョンでは、 OpenSSL X.509 型のリソースを返していました。
8.0.0 certificate は、 OpenSSLCertificate クラスのインスタンスを受け入れるようになりました。 これより前のバージョンでは、 OpenSSL X.509 型のリソースを受け入れていました。
add a note

User Contributed Notes 3 notes

up
5
marc theat nwd thedot mx
13 years ago
To get the real timestamps as integer values for the validity daterange you can use as follows:

<?php
$data
= openssl_x509_parse(file_get_contents('/path/to/cert.crt'));

$validFrom = date('Y-m-d H:i:s', $data['validFrom_time_t']);
$validTo ) date('Y-m-d H:i:s', $data['validTo_time_t']);

echo
$validFrom . "\n";
echo
$validTo . "\n";

?>
up
4
Anonymous
21 years ago
After some tests I've been able to get some results this way ...

<?php

$fp
= fopen("/etc/httpd/conf/ssl/moncertif.crt", "r");
$cert = fread($fp, 8192);
fclose($fp);

echo
"Read<br>";
echo
openssl_x509_read($cert);
echo
"<br>";
echo
"*********************";
echo
"<br>";
echo
"Parse<br>";
print_r(openssl_x509_parse($cert));
/*
// or
print_r(openssl_x509_parse( openssl_x509_read($cert) ) );
*/

?>

enjoy
;)
up
1
anthony dot whitehead at rfv dot sfa dot se
21 years ago
Short HOWTO for getting data out of a client certificate via an SSL enabled iPlanet (Netscape Enterprise or Sun ONE) web server.

The iPlanet server sets $_SERVER["CLIENT_CERT"] whenever a client authenticates with a certificate. This variable contains an encoded representation of the certificate presented by the client. This in itself is useless to scripts or applications, we need to extract the actual information from the encoding. It turns out that we are in luck, the encoding is NEARLY a standard PEM encoding which can be read by the openssl_x509_read() function. A standard PEM has a begin line, an end line and inbetween is a base64 encoding of the DER representation of the certificate. PEM requires that linefeeds be present every 64 characters, however this is already the case with our CLIENT_CERT variable. For some reason the iPlanet server neglects to attach the begin and end headers, all that is required to allow access to the certificate is replacing these headers. Here is a small code excerpt for doing just that and printing out the raw certificate data.

<?php
$beginpem
= "-----BEGIN CERTIFICATE-----\n";
$endpem = "-----END CERTIFICATE-----\n";

// Small function to print the data recursivly.
function print_element($item, $key)
{
if(
is_array( $item ) )
{
echo
"$key is Array:\n";
array_walk( $item, 'print_element' );
echo
"$key done\n";
}
else
echo
"$key = $item\n";
}

// Build the PEM string.
$pemdata = $beginpem.$_SERVER["CLIENT_CERT"]."\n".$endpem;

// Get a certificate resource from the PEM string.
$cert = openssl_x509_read( $pemdata );

// Parse the resource and print out the contents.
$cert_data = openssl_x509_parse( $cert );
array_walk( $cert_data, 'print_element' );

// Free the resource
openssl_x509_free( $cert );
?>
To Top