PHP Conference Japan 2024

openssl_pkey_get_public

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

openssl_pkey_get_public從憑證中提取公鑰並準備使用

說明

openssl_pkey_get_public()public_key 提取公鑰,並準備供其他函式使用。

參數

public_key

public_key 可以是以下其中之一

  1. 一個 OpenSSLAsymmetricKey 實例
  2. 一個格式為 file://path/to/file.pem 的字串。指定的檔案必須包含 PEM(隱私增強郵件)編碼的憑證/公鑰(它可以同時包含兩者)。
  3. 一個 PEM(隱私增強郵件)格式的公鑰。

回傳值

成功時返回一個 OpenSSLAsymmetricKey 實例,錯誤時返回 false

更新日誌

版本 說明
8.0.0 成功時,此函數現在返回一個 OpenSSLAsymmetricKey 實例;以前返回的是類型為 OpenSSL key資源
8.0.0 public_key 現在接受 OpenSSLAsymmetricKeyOpenSSLCertificate 實例;以前接受類型為 OpenSSL keyOpenSSL X.509資源
新增筆記

使用者貢獻的筆記 7 則筆記

info at steyla dot com
13 年前
如果您嘗試讀取 PKCS#1 RSA 公鑰,您會遇到問題,因為 openssl 需要 X.509 格式的公鑰。

PKCS#1 RSA 公鑰

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAgYxTW5Yj+5QiQtlPMnS9kqQ/HVp+T2KtmvShe68cm8luR7Dampmb
[...]
cbn6n2FsV91BlEnrAKq65PGJxcwcH5+aJwIDAQAB
-----END RSA PUBLIC KEY-----

.. 無法讀取,而 X.509 格式的公鑰

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgYxTW5Yj+5QiQtlPMnS9
[..]
JwIDAQAB
-----END PUBLIC KEY-----

可以讀取。您可以使用一個簡單(且不太正規)的變通方法來讀取 PKCS#1 RSA。X.509 格式公鑰的前幾個位元組包含標頭資訊,可以毫無顧忌地複製。

換句話說:刪除上述 X.509 金鑰中前 32 個位元組之後的所有內容(從 Q8A 後面開始),並附加您的 PKCS#1 資料,重新格式化為 64 個位元組的長度,然後將其與 openssl 一起使用。

請注意:上述範例僅適用於 2048 位元長度。

就像我說的 - 這有點不太正規 - 但是,如果您像我一樣走投無路的話。

Michaela
Joey
8 年前
我花了幾個小時與這個函數搏鬥,並把頭撞在桌子上,試圖讓它載入一個公開的 PEM 金鑰。

即使成功,此函數也可能會在 openssl_error_string 中留下錯誤,因此這可能會在之後造成很多混亂。尤其是當您正在進行原型設計並且尚未對回傳值進行完整檢查時。即使成功呼叫其他函數,錯誤也不會被清除。

為避免混淆,您應該始終檢查回傳結果,並且僅在呼叫返回失敗 (false) 的 openssl 函數後才呼叫 openssl_error_string。
匿名
17 年前
您可以使用 openssl_pkey_get_details(resource $key) 函數取得(並儲存到檔案)公鑰

<?php
$pub_key
= openssl_pkey_get_public(file_get_contents('./cert.crt'));
$keyData = openssl_pkey_get_details($pub_key);
file_put_contents('./key.pub', $keyData['key']);
?>
GeniusLe at zslm dot org
4 年前
您可能需要從私鑰導出公鑰,因為其他工具產生的金鑰所提供的公鑰是 PEM 格式,而我們需要 OpenSSH 格式。

```
<?php
$public
= openssl_pkey_get_details(openssl_pkey_get_private(OPENSSL_USER_PRIVATE_KYE))['key'];

// 儲存 $public

```
匿名
20 年前
此文件說明它可以接受 PEM 格式的私鑰,但根據錯誤 #25614,這在任何形式下都是不可能的。 該函數只會返回 FALSE。

您唯一可以从中获取公钥的是 X.509 憑證。

此外,沒有辦法將公鑰導出為 PEM 編碼格式。
dankybastard at hotmail
19 年前
您也必須使用憑證的字串表示形式來獲取公鑰資源

$dn = array(); // 使用預設值
$res_privkey = openssl_pkey_new();
$res_csr = openssl_csr_new($dn, $res_privkey);
$res_cert = openssl_csr_sign($res_csr, null, $res_privkey, $ndays);

openssl_x509_export($res_cert, $str_cert);

$res_pubkey = openssl_pkey_get_public($str_cert);
VaD
16 年前
這段程式碼裡有個小錯誤

$pub_key = openssl_pkey_get_public(file_get_contents('./cert.crt'));
$keyData = openssl_pkey_get_details($pub_key);
file_put_contents('./key.pub', $keyData['key']);
To Top