openssl_x509_parse

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

openssl_x509_parse解析 X509 证书并将信息作为数组返回

说明

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

openssl_x509_parse() 返回有关提供的 certificate 的信息,包括主题名称、颁发者名称、用途、有效期和有效期等字段。

参数

certificate

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

short_names

short_names 控制数组中的数据索引方式 - 如果 short_namestrue(默认值),则字段将使用短名称形式索引,否则将使用长名称形式 - 例如:CN 是 commonName 的短名称形式。

返回值

返回数据的结构(有意地)尚未记录,因为它仍在不断变化。

变更日志

版本 说明
8.0.0 certificate 现在接受 OpenSSLCertificate 实例;以前,接受类型为 OpenSSL X.509资源
添加笔记

用户贡献的笔记 7 笔记

8
nathanael at dihedral dot de
18 年前
处理 x509 crt 文件的用途时
openssl_x509_parse 的输出给出了一个数组,其中包含以下内容,用于说明用途
每个新数组(例如 [purposes][1]、[purposes][2])都是一个新的用途检查
我将此输出与以下命令的输出进行了比较
# openssl x509 -purpose -in <x509crt_file>
我得到的结果是
[purposes][x][2] 很明显是所检查用途的名称
[purposes][x][1] 对应于作为 CA 的测试用途(如 [purposes][x][2] 中命名的那样)
[purposes][x][0] 对应于该用途的一般可用性

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

)
3
maarten at xolphin dot nl
19 年前
目前,非常有用的 X509 OID(如 streetAddress、postalCode 等)缺失。您可以在 http://www.alvestrand.no/objectid/2.5.4.html, 上找到它们的列表,我希望它们很快被添加到 openssl-x509-parse 中。

在那之前,您可以通过以下方式获得这些 OID

<?
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']);
?>

Horde 框架中的 parseCert 函数对此也很有用。
1
Stilez
8 年前
有效期信息以两种不同的格式返回两次。它们可以转换为普通的日期时间对象,如下所示

$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');
/* 这些给出相同的结果 */

要直接获得人类可读的格式(或任何其他格式化的字符串)而不是日期时间对象,请使用以下方法

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

同样适用于 validTo 和 validTo_time_t
2
smgallo at buffalo dot edu
19 年前
自 PHP4 以来,证书名称和主题数组中电子邮件部分的标识符已更改。在 PHP 4.3.0 中,返回以下数组(通过 print_r() 显示)

[name] => /O=Grid/O=Globus/O=CCR Grid Portal/OU=Portal User/CN=Test User/[email protected]
[subject] => Array
(
[O] => Grid/O=Globus/O=CCR Grid Portal
[OU] => Portal User
[CN] => Test User
[Email] => [email protected]
...

PHP5 中的结果是(注意 Email -> emailAddress)

[name] => /O=Grid/O=Globus/O=CCR Grid Portal/OU=Portal User/CN=Test User/[email protected]
[subject] => Array
(
[O] => Grid/O=Globus/O=CCR Grid Portal
[OU] => Portal User
[CN] => Test User
[emailAddress] => [email protected]
...

当然,手册中确实说明了这种情况可能会发生。:)
1
s dot stok at rollerscapes dot net
14 年前
可选主题可以作为扩展读取。

[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
16 年前
关于前一个笔记:对 x509v3 扩展的支持已在 PHP 5.2 中添加。同样,在 PHP5 5.2.4 之前的版本中,x509v3 扩展的值没有被解码,并且以 DER 二进制表示形式返回。因此,为了读取 v3 扩展的内容,您必须自己解析相关的 ASN.1 结构。

例如,如果需要读取 OID 为 1.3.6.1.4.1.7782.3.3 的私有扩展中的 IA5STRING 值,则可以执行以下操作

<?php

/* 解析 DER 编码的 IA5STRING 表示形式,长度 < 127 */
function asn1der_ia5string($str)
{
$len=strlen($str)-2;
if (
$len < 0 && $len > 127) {
return
false;
}

/* 检查标签和长度 */
if (22 != (ord($str[$pos++]) & 0x1f) &&
ord($str[$pos++]) != $len) {
/* 不是 IA5STRING 的有效 DER 编码 */
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'])); // 打印解码的 ASCII 字符串

?>

在较新的版本(>5.2.3)中,扩展以“可读格式”返回。例如

<?php print_r(openssl_x509_parse(...)); ?>
将导致
<?
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
....
?>
-4
zioproto at gmail dot com
16 年前
要从 X.509 证书中读取扩展,如果您知道 OID,则可以执行以下操作

//从文件中读取证书
$cert = file_get_contents('test.crt');
$ssl = openssl_x509_parse($cert);

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

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

由于 $ssl 数组没有文档记录,您可以像这样轻松查看其内容

// 打印整个数组!
print_r(array_values($ssl));
print_r(array_keys($ssl));
To Top