与其为您的私钥容器启用旧版提供程序以使其与 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 設定的變更。
回覆 Anonymous 的註記:( https://php.dev.org.tw/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.dev.org.tw/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.dev.org.tw/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