不必为您的私钥容器启用旧版提供程序以使其与 openssl3 协同工作,您可以简单地使用最新的 openssl 重新打包容器
openssl pkcs12 -legacy -in key.p12 -nodes -out key_decrypted.tmp
openssl pkcs12 -in key_decrypted.tmp -export -out key_new.p12
(PHP 5 >= 5.2.2, PHP 7, PHP 8)
openssl_pkcs12_read — 将 PKCS#12 证书存储解析到数组中
$pkcs12
, array &$certificates
, #[\SensitiveParameter] string $passphrase
): bool
openssl_pkcs12_read() 将由 pkcs12
提供的 PKCS#12 证书存储解析到名为 certificates
的数组中。
pkcs12
证书存储内容,而不是其文件名。
certificates
成功时,它将保存证书存储数据。
passphrase
用于解锁 PKCS#12 文件的加密密码。
示例 #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;
}
?>
不必为您的私钥容器启用旧版提供程序以使其与 openssl3 协同工作,您可以简单地使用最新的 openssl 重新打包容器
openssl pkcs12 -legacy -in key.p12 -nodes -out key_decrypted.tmp
openssl pkcs12 -in key_decrypted.tmp -export -out key_new.p12
自 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 配置更改。
针对 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 版本时会失败。
针对 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+
针对 Anonymous 的评论:(https://php.net/manual/en/function.openssl-pkcs12-read.php#128790)
我在 Windows 上使用 8.2.6,此函数正常工作。
它似乎确实仅取决于 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