无需为私钥容器启用旧版提供程序以使其与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证书存储解析为数组
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 "错误:无法读取证书文件\n";
exit;
}
if (openssl_pkcs12_read($cert_store, $cert_info, "my_secret_pass")) {
echo "证书信息\n";
print_r($cert_info);
} else {
echo "错误:无法读取证书存储。\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配置更改。
回复匿名用户的评论:(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+。
回复匿名用户的评论:(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(根据此处匿名用户报告的内容)
OpenSSL 3
- Linux Ubuntu jammy (22.04 LTS) PHP 8.1
- Mac OS Homebrew PHP 8.1和8.2