PHP Conference Japan 2024

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 則註記

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
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 設定的變更。
Rovinson
1 年前
回覆 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 版本的則會失敗。
Anonymous
1 年前
由於 OpenSSL 函式庫從 ^1 版變更為 ^3 版,openssl_pkcs12_read 方法在 PHP 8.2 中無法運作。
at jornane.no
1 年前
回覆 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+ 為目標。
Also Anonymous
1 年前
回覆 Anonymous 的註記:( https://php.dev.org.tw/manual/en/function.openssl-pkcs12-read.php#128790 )

我在 Windows 上使用 8.2.6,這個函式運作正常。
InvisibleSmiley
1 年前
它似乎真的只取決於 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