openssl_pkcs12_read

(PHP 5 >= 5.2.2, PHP 7, PHP 8)

openssl_pkcs12_readPKCS#12 证书存储解析到数组中

描述

openssl_pkcs12_read(string $pkcs12, array &$certificates, #[\SensitiveParameter] string $passphrase): bool

openssl_pkcs12_read() 将由 pkcs12 提供的 PKCS#12 证书存储解析到名为 certificates 的数组中。

参数

pkcs12

证书存储内容,而不是其文件名。

certificates

成功时,它将保存证书存储数据。

passphrase

用于解锁 PKCS#12 文件的加密密码。

返回值

成功时返回 true,失败时返回 false

示例

示例 #1 openssl_pkcs12_read() 示例

<?php
if (!$cert_store = file_get_contents("/certs/file.p12")) {
echo
"Error: Unable to read the cert file\n";
exit;
}

if (
openssl_pkcs12_read($cert_store, $cert_info, "my_secret_pass")) {
echo
"Certificate Information\n";
print_r($cert_info);
} else {
echo
"Error: Unable to read the cert store.\n";
exit;
}
?>
添加注释

用户贡献的注释 7 notes

rrequalwt
9 个月前
不必为您的私钥容器启用旧版提供程序以使其与 openssl3 协同工作,您可以简单地使用最新的 openssl 重新打包容器

openssl pkcs12 -legacy -in key.p12 -nodes -out key_decrypted.tmp

openssl pkcs12 -in key_decrypted.tmp -export -out key_new.p12
fran at fran dot cr
10 个月前
自 OpenSSL 3 以来,此函数将无法使用使用旧版密码的 .p12 文件。不幸的是,今天从许多基于 Windows 的 CA 生成的 .p12 文件默认情况下使用这些密码。

OpenSSL 3 使用一个提供程序机制,其中有一个旧版提供程序支持这些旧版密码,但默认情况下它是禁用的。

虽然 PHP SSL 模块缺乏启用旧版提供程序的机制,但您需要手动修改 PHP 使用的 openssl.conf,它通常与系统 openssl 命令使用的相同,因此“openssl version -d”命令返回的 OPENSSLDIR 路径值包含要修改的 openssl.conf 文件。需要添加、修改或取消注释的行如下所示

openssl_conf = openssl_init

[openss_init]
providers = provider_sect

[provider_sect]
default = default_sect
legacy = legacy_sect

[default_sect]
activate = 1

[legacy_sect]
activate = 1

这可能需要重新启动相关 PHP 服务(通常是 php-fpm)以加载 OpenSSL 配置更改。
Rovinson
11 个月前
针对 Anonymous 的评论:(https://php.net/manual/es/function.openssl-pkcs12-read.php#128819)

在 PHP 8.2.6 和 8.2.7 版本中,仍然使用 OpenSSL 1.1.1。但是,从 PHP 8.2.8 版本开始,将使用 OpenSSL 3.0.9。

我已经进行了测试,该函数在所有使用 OpenSSL 1 的 PHP 版本中都可以正常工作,但在使用 OpenSSL 3 版本时会失败。
Anonymous
1 年前
由于 OpenSSL 库从 ^1 版更改为 ^3 版,因此 openssl_pkcs12_read 方法在 PHP 8.2 中不起作用。
at jornane.no
9 个月前
针对 Rovinson (https://php.net/manual/en/function.openssl-pkcs12-read.php#128854)

> 在 PHP 8.2.6 和 8.2.7 版本中,仍然使用 OpenSSL 1.1.1。
> 但是,从 PHP 8.2.8 版本开始,将使用 OpenSSL 3.0.9。

这是不正确的;Debian 12 目前使用 PHP 8.2.7,但它确实使用 OpenSSL 3.0.11。因此,对于版本检查,我建议将目标版本设为 PHP 8.2+
Also Anonymous
11 个月前
针对 Anonymous 的评论:(https://php.net/manual/en/function.openssl-pkcs12-read.php#128790)

我在 Windows 上使用 8.2.6,此函数正常工作。
InvisibleSmiley
10 个月前
它似乎确实仅取决于 OpenSSL 版本。我检查了

OpenSSL 1
- Linux Sury PHP 8.1 和 8.2
- Windows(根据 Anonymous 在此处的报告)

OpenSSL 3
- Linux Ubuntu jammy (22.04 LTS) PHP 8.1
- Mac OS Homebrew PHP 8.1 和 8.2
To Top