PHP Conference Japan 2024

openssl_x509_read

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

openssl_x509_read解析 X.509 证书并返回其对象

描述

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

openssl_x509_read() 解析由 certificate 提供的证书,并返回其 OpenSSLCertificate 对象。

参数

certificate

X509 证书。有关有效值的列表,请参阅 密钥/证书参数

返回值

成功时返回 OpenSSLCertificate 对象,失败时返回 false

变更日志

版本 描述
8.0.0 成功时,此函数现在返回一个 OpenSSLCertificate 实例;以前,返回的是类型为 OpenSSL X.509资源
8.0.0 certificate 现在接受 OpenSSLCertificate 实例;以前,接受的是类型为 OpenSSL X.509资源
添加注释

用户贡献的注释 3 条注释

5
marc theat nwd thedot mx
13 年前
要获取有效日期范围的真实时间戳作为整数值,您可以按如下方式使用:

<?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";

?>
4
匿名
21 年前
经过一些测试,我已经能够通过这种方式获得一些结果……

<?php

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

echo
"读取<br>";
echo
openssl_x509_read($cert);
echo
"<br>";
echo
"*********************";
echo
"<br>";
echo
"解析<br>";
print_r(openssl_x509_parse($cert));
/*
// 或者
print_r(openssl_x509_parse( openssl_x509_read($cert) ) );
*/

?>

享受
;)
1
anthony dot whitehead at rfv dot sfa dot se
21 年前
通过启用 SSL 的 iPlanet(Netscape Enterprise 或 Sun ONE)Web 服务器获取客户端证书数据的简短 HOWTO。

每当客户端使用证书进行身份验证时,iPlanet 服务器都会设置 $_SERVER["CLIENT_CERT"]。此变量包含客户端提供的证书的编码表示形式。这本身对脚本或应用程序无用,我们需要从编码中提取实际信息。事实证明,我们很幸运,编码几乎是标准的 PEM 编码,可以使用 openssl_x509_read() 函数读取。标准 PEM 具有开始行、结束行,中间是证书 DER 表示的 base64 编码。PEM 要求每 64 个字符都存在换行符,但是我们的 CLIENT_CERT 变量已经如此。由于某种原因,iPlanet 服务器忽略了附加开始和结束标题,要访问证书,只需替换这些标题即可。这是一个执行此操作并打印原始证书数据的简短代码片段。

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

// 用于递归打印数据的函数。
function print_element($item, $key)
{
if(
is_array( $item ) )
{
echo
"$key 是数组:\n";
array_walk( $item, 'print_element' );
echo
"$key 完成\n";
}
else
echo
"$key = $item\n";
}

// 构建 PEM 字符串。
$pemdata = $beginpem.$_SERVER["CLIENT_CERT"]."\n".$endpem;

// 从 PEM 字符串获取证书资源。
$cert = openssl_x509_read( $pemdata );

// 解析资源并打印出内容。
$cert_data = openssl_x509_parse( $cert );
array_walk( $cert_data, 'print_element' );

// 释放资源
openssl_x509_free( $cert );
?>
To Top