2024年PHP日本大会

openssl_pkcs12_read

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

openssl_pkcs12_readPKCS#12证书存储解析为数组

描述

openssl_pkcs12_read(字符串 $pkcs12, 数组 &$certificates, #[\SensitiveParameter] 字符串 $passphrase): 布尔值

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
"错误:无法读取证书文件\n";
exit;
}

if (
openssl_pkcs12_read($cert_store, $cert_info, "my_secret_pass")) {
echo
"证书信息\n";
print_r($cert_info);
} else {
echo
"错误:无法读取证书存储。\n";
exit;
}
?>
添加注释

用户贡献的注释 7 条注释

10
rrequalwt
1 年前
无需为私钥容器启用旧版提供程序以使其与openssl3一起使用,只需使用最新的openssl重新打包容器即可

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

openssl pkcs12 -in key_decrypted.tmp -export -out key_new.p12
9
fran at fran dot cr
1 年前
从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配置更改。
2
Rovinson
1 年前
回复匿名用户的评论:(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版本则会失败。
2
匿名用户
1 年前
由于OpenSSL库从^1版本更改为^3版本,openssl_pkcs12_read方法在PHP 8.2中无法工作。
2
at jornane.no
1 年前
回复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+。
1
同样是匿名用户
1 年前
回复匿名用户的评论:(https://php.net/manual/en/function.openssl-pkcs12-read.php#128790)

我在Windows上使用8.2.6,此函数运行正常。
2
InvisibleSmiley
1 年前
它似乎确实只取决于OpenSSL版本。我检查了

OpenSSL 1
- Linux Sury PHP 8.1和8.2
- Windows(根据此处匿名用户报告的内容)

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