2024 PHP Conference Japan (日本 PHP 研討會)

OpenSSL

新增註釋

使用者貢獻的註釋 2 則註釋

bdh dot hall at gmail dot com
15 年前
我花了很長時間尋找使用私鑰/公鑰系統進行非同步加密/解密的說明,而且我必須使用它來建立使用定期計費的信用卡模組。

使用普通的「同步」或雙向加密來做這件事是很愚蠢的,所以整個 mcrypt 函式庫都派不上用場。

但事實證明,OpenSSL 非常容易使用……然而它的文件卻非常稀少,以至於看起來會非常困難。

所以我分享我這一天的研究成果——希望對您有所幫助!

<?php

if (isset($_SERVER['HTTPS']) )
{
echo
"安全連線:此頁面正在透過安全連線存取。<br><br>";
}
else
{
echo
"非安全連線:此頁面正在透過非安全連線存取。<br><br>";
}

// 建立金鑰對
$res=openssl_pkey_new();

// 取得私鑰
openssl_pkey_export($res, $privatekey);

// 取得公鑰
$publickey=openssl_pkey_get_details($res);
$publickey=$publickey["key"];

echo
"私鑰:<BR>$privatekey<br><br>公鑰:<BR>$publickey<BR><BR>";

$cleartext = '1234 5678 9012 3456';

echo
"明文:<br>$cleartext<BR><BR>";

openssl_public_encrypt($cleartext, $crypttext, $publickey);

echo
"加密文字:<br>$crypttext<BR><BR>";

openssl_private_decrypt($crypttext, $decrypted, $privatekey);

echo
"解密文字:<BR>$decrypted<br><br>";
?>

非常感謝文件中其他貢獻者的協助,讓這件事變得更容易。

請注意,您只需要使用這些函式產生金鑰一次 — 將您的私鑰離線儲存以進行解密,並將您的公鑰放在您的腳本/設定檔中。如果您的資料遭到入侵,您不用擔心加密的資料或公鑰,只有私鑰和明文才真正重要。

祝您好運!
koen dot thomeer at pubmed dot be
16 年前
若要使用 OCSP 檢查用戶端憑證的狀態,您可以使用此腳本

<?php
// 使用者變數:
$dir = '/path/to/temp/'; // Apache 可存取的目錄 (chmod 777)。
$RootCA = '/path/to/Root.cer'; // 指向 PEM 格式的根憑證。
$OCSPUrl = 'http://ocsp.url'; //指向 OCSP URL
// 腳本:
$a = rand(1000,99999); // 如果您預期在一秒鐘內有更多頁面點擊,則需要此項!
file_put_contents($dir.$a.'cert_i.pem', $_SERVER['SSL_CLIENT_CERT_CHAIN_0']); // 簽發者憑證。
file_put_contents($dir.$a.'cert_c.pem', $_SERVER['SSL_CLIENT_CERT']); // 用戶端(驗證)憑證。
$output = shell_exec('openssl ocsp -CAfile '.$RootCA.' -issuer '.$dir.$a.'cert_i.pem -cert '.$dir.$a.'cert_c.pem -url '.$OCSPUrl);
$output2 = preg_split('/[\r\n]/', $output);
$output3 = preg_split('/: /', $output2[0]);
$ocsp = $output3[1];
echo
"OCSP 狀態:".$ocsp; // 將會是「good」、「revoked」或「unknown」
unlink($dir.$a.'cert_i.pem');
unlink($dir.$a.'cert_c.pem');
?>

這可以再改進,但这只是一个開始!

通常,您可以從用戶端憑證中提取 OCSP URL。此外,OCSP 請求僅包含簽發者名稱的雜湊值、簽發者金鑰的雜湊值以及用戶端憑證的序號。這三項都可以直接從用戶端憑證中提取。
To Top