PHP Conference Japan 2024

openssl_pkcs7_encrypt

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

openssl_pkcs7_encrypt加密 S/MIME 訊息

描述

openssl_pkcs7_encrypt(
    string $input_filename,
    string $output_filename,
    OpenSSLCertificate|array|string $certificate,
    ?array $headers,
    int $flags = 0,
    int $cipher_algo = OPENSSL_CIPHER_AES_128_CBC
): bool

openssl_pkcs7_encrypt() 取得名為 input_filename 的檔案內容,並使用 RC2 40 位元加密演算法加密,使其只能由 certificate 指定的預期接收者讀取。

參數

input_filename

output_filename

certificate

單個 X.509 憑證,或 X.509 憑證陣列。

headers

headers 是一個標頭陣列,將在加密後附加到資料的前面。

headers 可以是一個以標頭名稱為鍵的關聯陣列,或是一個索引陣列,其中每個元素包含單個標頭行。

flags

flags 可以用於指定影響編碼過程的選項 - 請參閱 PKCS7 常數

cipher_algo

加密常數 之一。

回傳值

成功時回傳 true,失敗時回傳 false

更新日誌

版本 描述
8.1.0 預設加密演算法 (cipher_algo) 現在是 AES-128-CBC (OPENSSL_CIPHER_AES_128_CBC)。先前使用的是 PKCS7/CMS (OPENSSL_CIPHER_RC2_40)。
8.0.0 certificate 現在接受 OpenSSLCertificate 實例;先前接受類型為 OpenSSL X.509 CSR資源

範例

範例 1 openssl_pkcs7_encrypt() 範例

<?php
// 您要加密並傳送給您秘密探員的訊息
// 在現場,稱為夜鷹。您在檔案 nighthawk.pem 中有他的憑證
$data = <<<EOD
夜鷹,

絕密,僅供您閱覽!

敵人正在逼近!請在早上 8 點 30 分在咖啡館與我會面,
以取得您偽造的護照!

總部
EOD;

// 載入金鑰
$key = file_get_contents("nighthawk.pem");

// 將訊息儲存到檔案
$fp = fopen("msg.txt", "w");
fwrite($fp, $data);
fclose($fp);

// 加密它
if (openssl_pkcs7_encrypt("msg.txt", "enc.txt", $key,
array(
"To" => "nighthawk@example.com", // 鍵控語法
"From: HQ <hq@example.com>", // 索引語法
"Subject" => "僅限閱覽"))) {
// 訊息已加密 - 傳送它!
exec(ini_get("sendmail_path") . " < enc.txt");
}
?>

新增註解

使用者貢獻的註解 15 個註解

4
ungdi at hotmail dot com
19 年前
在許多關於單獨簽署或加密電子郵件的討論中,沒有任何一個真正討論過同時簽署和加密電子郵件的痛苦。

*** 您先做什麼?先簽署再加密?還是先加密再簽署?

根據 RFC 2311,您可以先加密再簽署,或先簽署再加密。但是,這取決於您正在為其編寫程式的客戶端。以我的經驗,在 Outlook 2000 中,它偏好先加密再簽署。而在 Outlook 2003 中,則是先簽署再加密。一般來說,您會希望先簽署再加密,因為從郵件的角度來看,這似乎最合乎邏輯。您首先簽署一封信,然後將其放入信封。如果您以它不喜歡的順序執行此操作,某些客戶端會抱怨,因此您可能需要進行實驗。

*** 同時執行簽署和加密的範例。

當您執行第一個函式時,請勿在標頭陣列參數中放入任何標頭,您需要將其放入您要執行的第二個函式中。如果您將標頭放入第一個函式中,則第二個函式會將其從郵件伺服器中隱藏起來。您不希望這樣。在這裡,我將先簽署再加密。

<?
// 設定郵件標頭。
$headers = array("To" => "someone@nowhere.net",
"From" => "noone@somewhere.net",
"Subject" => "已簽署和加密的訊息。");

// 先簽署訊息
openssl_pkcs7_sign("msg.txt","signed.txt",
"signing_cert.pem",array("private_key.pem",
"password"),array());

// 取得公開金鑰憑證。
$pubkey = file_get_contents("cert.pem");

// 加密訊息,現在放入標頭。
openssl_pkcs7_encrypt("signed.txt", "enc.txt",
$pubkey,$headers,0,1);

$data = file_get_contents("enc.txt");

// 分離標頭和內文,以便與 mail 函式一起使用
// 不幸但必要,否則我們會有兩組標頭
// 而且電子郵件用戶端不會解碼附件
$parts = explode("\n\n", $data, 2);

// 發送郵件 (Headers 參數中的標頭會覆蓋為 To 和 Subject 參數產生的標頭)
// 為 To 和 Subject 參數產生的標頭)
mail($mail, $subject, $parts[1], $parts[0]);
?>

請注意,如果您使用一個從磁碟擷取資料的函式,以便在程式中的另一個函式中使用,請記住您可能使用了 explode("\n\n",$data,2) 函式,這可能會移除標頭和訊息內容之間的間距。

當您取得簽署的訊息並將其輸入到加密部分時,您必須記住,行距也必須作為訊息本文的一部分輸入!如果您計劃先簽署然後加密,請勿將簽署的標頭輸出作為標頭陣列參數的一部分輸入到加密中!簽署的輸出應保留為要加密的訊息本文的一部分。(如果您正在執行加密然後簽署的相反操作,情況也是如此。)以下範例說明如何將簽署和加密函式製作成可重複使用的常式,然後呼叫以簽署和加密訊息。

*** 從常式函式執行簽署和加密的範例,以透過程式碼重複使用。

這是錯誤的!
<?
// 陣列 [0] 包含訊息的標頭。[1] 包含訊息的已簽署內文。
$signedOutputArray = signMessage($inputMessage,$headers);

// 陣列 [0] 包含訊息的標頭和簽署。
// 陣列 [1] 包含沒有簽署標頭的加密訊息內文。
$signedAndEncryptedArray = encryptMessage($signedOutputArray[1],
$signedOutputArray[0]);

mail($emailAddr,$subject,$signedAndEncryptedArray[1],
$signedAndEncryptedArray[0]);
?>

這是正確的!
<?
// 陣列 [0] 包含簽署的標頭。
// 陣列 [1] 包含訊息的已簽署內文。
$signedOutputArray = signMessage($inputMessage,array());

// 陣列 [0] 包含訊息的標頭。
// 陣列 [1] 包含已簽署訊息及其簽署標頭的加密內容。
$signedAndEncryptedArray =
encryptMessage($signedOutputArray[0] . "\n\n" . $signedOutputArray[1],$headers);

mail($emailAddr,$subject,$signedAndEncryptedArray[1],
$signedAndEncryptedArray[0]);
?>
1
匿名
12 年前
為了在人們已經完成的基礎上構建,以下是一個函式,它接受發件人地址、電子郵件/公開金鑰的陣列、主旨和訊息,並使用適當的公開金鑰發送加密訊息。

由於我們要發送加密訊息,因此假設我們發送的內容實際上是關鍵的。因此,用於發送訊息的檔案會立即被粉碎。

$recipients = Array("user@example.com"=>file_get_contents("cert.pem"));
$body = '秘密文字';
sendSignedMail("me@examplel.com", $recipients, "測試訊息", $body);

// 接收者是電子郵件地址=>金鑰的陣列
function sendSignedMail($from, $recepients, $subject, $body){
foreach($recepients AS $email=>$key){
$tfn_in = tempnam("/tmp", "b");
$tfn_out = tempnam("/tmp", "e");

$handle = fopen($tfn_in, "w");
fwrite($handle, $body);
fclose($handle);

openssl_pkcs7_encrypt($tfn_in, $tfn_out, $key,
array("To" => $email,
"From" => $from,
"Subject" => $subject), 0);
$data = file_get_contents($tfn_out);

// 由於這是敏感資料,因此請粉碎檔案。
$handle = popen("/usr/bin/shred -n 3 -u $tfn_in", 'r');
pclose($handle);
$handle = popen("/usr/bin/shred -n 3 -u $tfn_out", 'r');
pclose($handle);


$parts = explode("\n\n", $data, 2);//修正 mail 函式中的標頭

mail($email, $subject, $parts[1], $parts[0]);

}

}
2
1matqo1 at azet dot sk
14 年前
對於所有花了大量時間嘗試加密 multipart/alternative 電子郵件但沒有成功的人

1.) 將完整的電子郵件(標頭與內文)放入檔案中進行加密,如 koen 的範例所示
<?php
$body
= file_get_contents("body.txt");
$msg = $enc_header.$body;
file_put_contents("msg.txt", $msg);
?>

2.) 發送到 openssl_pkcs7_encrypt 的標頭陣列不能包含某些標頭,它會衝突/重複,並且某些用戶端會遇到問題 - 例如,Thunderbird 不會顯示電子郵件內文。對我來說有效的標頭是:"Subject"、"To"、"From"、"Reply-To"、"Date"、"Return-Receipt"、"Message-ID"、"CC"、"X-Priority"、"X-Mailer"

還有一件事 - 如果您的加密公開金鑰無法正常運作,請檢查您是否正在傳送帶有金鑰的憑證,而不僅僅是純金鑰(必須是憑證)

祝大家好運,這有點困難,因為文檔很少,有時會讓人感到困惑...
0
Matthias Barkhausen
4 年前
要成功簽署和加密純文字電子郵件,以便傳送給 Outlook 和 iOS Mail 並使其能夠讀取,您需要先在沒有標頭的情況下使用 PKCS7_TEXT 常數進行簽署,然後使用標頭和密碼 3DES 進行加密,然後使用 sendmail/ssmtp 以 -t 選項傳送。

3DES 的原因是 iOS(或一般的 Apple)不再接受 openssl-pkcs7-encrypt 使用的 RC40 預設加密。Outlook 會解密此類加密,但 iOS Mail 只會顯示「此郵件沒有內容」和「安裝包含您身分的設定檔...」。

$headers = array("To" => ...,
"From" => ...,
"Subject" => ...);

openssl_pkcs7_sign("msg.txt","signed.txt", $mMyCertFileToIncludeForRecipient,array($mMyPrivKeyFileAsPEM, "密碼"),array(),PKCS7_TEXT);

openssl_pkcs7_encrypt("signed.txt","enc.txt",$pubkeyContents,$headers,0,OPENSSL_CIPHER_3DES);

shell_exec("ssmtp -t < enc.txt") #sendmail 相同的語法
0
Ryan Schaffner
12 年前
在摸索了大約一個小時後,我發現這可能會對某人有所幫助。當您匯出憑證時,請確保它是 base-64 憑證,因為這些函式無法讀取 DER 編碼的憑證。Windows 預設會使用 DER。它必須是 Base-64 憑證才能使其運作。
0
koen dot thomeer at pubmed dot be
16 年前
在上一個範例中,「常用」的郵件用戶端無法讀取解密的訊息。這些郵件用戶端在加密部分也需要標頭。

我也注意到上一個範例中有一些重複的標頭(「To:」和「Subject:」未被 mail() 中的 Headers 參數覆蓋)。這也可以透過取消設定 $headers_msg 中的「To:」和「Subject:」來修正。

body.txt 是包含郵件內文的檔案。
publickey.cer 是包含公開憑證的檔案。

<?php
// 設定郵件標頭。
$headers = array("From" => "from@mail.com", "To" => "to@mail.com", "Subject" => "大多數用戶端都可讀取的加密郵件", "X-Mailer" => "PHP/".phpversion());

// 取得公開金鑰憑證。
$pubkey = file_get_contents("publickey.cer");

// 加密部分的標頭
$eol = "\r\n";
$enc_header .= "From: ".$headers['From'].$eol;
$enc_header .= "To: ".$headers['To'].$eol;
$enc_header .= "Subject: ".$headers['Subject'].$eol;
$enc_header .= "Content-Type: text/plain; format=flowed; charset=\"iso-8859-1\"; reply-type=original".$eol;
$enc_header .= "Content-Transfer-Encoding: 7bit".$eol;
$enc_header .= "\n";

// 在加密訊息前面加上標頭
$body = file_get_contents("body.txt");
$msg = $enc_header.$body;
file_put_contents("msg.txt", $msg);

// 移除 mail() 的一些重複標頭
$headers_msg = $headers;
unset(
$headers_msg['To'], $headers_msg['Subject']);

// 加密訊息
openssl_pkcs7_encrypt("msg.txt", "enc.txt",$pubkey,$headers_msg,0,1);

// 分離 mail() 的標頭和內文
$data = file_get_contents("enc.txt");
$parts = explode("\n\n", $data, 2);

// 發送郵件
mail($headers['To'], $headers['Subject'], $parts[1], $parts[0]);
?>
0
ungdi AT hotmail DOT com
20 年前
從 PHP 5.0.0 開始,您可以選擇 64 位元 RC2 加密或 128 位元 RC2 加密。

現在新的函式說明應為
bool openssl_pkcs7_encrypt ( string infile, string outfile, mixed recipcerts, array headers [, int flags] [,int cipher])

其中 cipher 的 int 值為 0 或 1。0 = 64 位元,1 = 128 位元。
0
richardaburton at hotmail dot com
21 年前
使用 sendmail 並不具備很好的可攜性,而且既然 PHP 有 mail 函式可以完成這項工作,看起來有點愚蠢。問題在於,當電子郵件已經包含完整的標頭時,您要如何使用 mail 函式來傳送這封電子郵件?

如果您取出 `openssl_pkcs7_encrypt` 產生的檔案內容,並將其作為訊息資料傳遞給 mail 命令,最終您會得到一封具有兩組標頭的電子郵件(一組來自加密函式,另一組由 mail 命令新增)。結果是,第二組標頭(告知郵件客戶端該郵件已加密)會被忽略,而(base64 編碼的)加密郵件會以未解密的狀態顯示,而不是被解密。

解決方案非常簡單,但我想了一會兒才想到,所以我在這裡分享。載入檔案內容後,將標頭從內文分開。然後將標頭作為 `mail` 函式的 `additional_headers` 參數傳遞,並僅將電子郵件的內文作為 `mail` 函式的 `message` 參數傳遞。

您需要指定 `to` 和 `subject` 參數,但最終電子郵件(傳遞給收件人時)將會被真實加密電子郵件中的參數覆蓋。

<?php

$pubkey
= file_get_contents("cert.pem");

openssl_pkcs7_encrypt("msg.txt", "enc.txt", $pubkey,
array(
"To" => "nighthawk@example.com",
"From" => "HQ <hq@example.com>",
"Subject" => "Eyes only"), 0)

$data = file_get_contents("enc.txt");

// 分離標頭和內文,以與 mail 函式一起使用
// 不幸的是這是必要的,否則我們會得到兩組標頭
// 且電子郵件客戶端不會解碼附件
$parts = explode("\n\n", $data, 2);

// 發送郵件(Headers 參數中的標頭將會覆蓋為 To 和 Subject 參數產生的標頭)
mail($mail, $subject, $parts[1], $parts[0]);

?>

Richard。
0
richardaburton at hotmail dot com
21 年前
如果您不喜歡僅使用 RC2/40 位元的想法,您可以隨時重新編譯 php_openssl 擴充功能。只需在擴充功能的 openssl.c 原始程式碼檔案中搜尋 `EVP_rc2_40_cbc()` 呼叫,該呼叫會選擇這個密碼。將該呼叫替換為選擇另一個更好的密碼,例如 `EVP_rc2_cbc()` (RC2/128 位元) 或 `EVP_des_ede3_cbc()` (triple-DES)。

我修補了原始碼以允許將密碼選擇作為額外參數,但是從 CVS 取得最新的原始碼以提交修補程式時,發現這項工作似乎已經完成,所以看起來我們很快就會看到此功能。

Richard。
0
Anonymous
21 年前
考慮到 RC2/40 位元已經暴露為容易受到暴力破解的攻擊(例如,請參閱 www.distributed.net),僅使用它是相當可怕的。

這裡提供一種替代方法,允許更強的加密(128 位元)。這在 Solaris 8 上有效,但可以透過移除 "-rand" 參數及其隨機檔名來適應例如 Linux。

-------------程式碼片段-------------------

$execstring= "echo \"" . $yourbodytext . "\" | /usr/local/ssl/bin/openssl smime -encrypt -rc2-128 -rand /usr/local/apache/yoursecuredir/randomfile -text -to " . $recipient . " -from someuser@example.com -subject \"" . $subject . "\" /usr/local/apache/yoursecuredir/usercerts/someuser.pem | /usr/lib/sendmail -t";

exec($execstring,$returndata,$resultcode);

-------------程式碼片段-------------------

它需要使用者憑證的 .pem 格式。假設您已經從商業 CA(例如 www.thawte.com)取得憑證,那麼從您的瀏覽器匯出憑證(**不含** 私鑰)並將其複製到 PHP/Web 伺服器非常簡單。匯出過程是特定於瀏覽器的,但假設使用 MS Internet Explorer,您需要選擇功能表選項工具 -> 網際網路選項 -> 內容 -> 憑證 ->(在列表中反白顯示您的憑證)-> 匯出精靈。

匯出的檔案可能會是 DER 編碼的二進位檔
並具有類似 "whatever.CER" 的名稱,您需要將其轉換為 Privacy Enhanced message (PEM) 格式。通常,您現在會將該檔案傳輸到 *nix 機器,而執行此轉換的命令範例為

/usr/local/ssl/bin/openssl x509 -inform DER -outform PEM -in someuser.cer -out someuser.pem

在調整此程式碼時,一如既往地,務必確保以乾淨的方式取得傳遞到系統呼叫中的值(`$recipient` 等),以避免信任使用者提供的資料。
-1
bob at bobscheffler dot com
19 年前
這不值得。老實說,這聽起來是個好主意,但它實在太麻煩了。我已經使用 asp 完成了這項操作,但尚未找到使用 PGP 完成此操作的方法(或者說,還沒真正嘗試過)。使用 asp 花了我整整一天的時間(需要稍微修改一下才能正常工作)。再會--
-1
glyn at tomkins dot net
21 年前
我一直在努力讓 `openssl_pkcs7_encrypt()` 按照我需要的方式工作,但透過我的堅持,我成功了。我遇到的問題是因為我對 S/MIME、MIME 和電子郵件標頭的理解非常不完整。

首先,手冊中的範例和 msisolak 上述提供的更正也都略有不正確。讓我用通俗易懂的方式解釋問題是如何產生的...

電子郵件訊息的結構如下

headers
空白行
內容

對於 S/MIME,訊息會被加密(包括標頭),並且會在加密訊息周圍包裝額外的標頭,如下所示

S/MIME 標頭
空白行
加密的 MIME 標頭
加密的空白行
加密的內容

如果您在加密的內容中沒有標頭,那麼第一個空白行之前的任何內容都會被視為標頭,並且不會出現在訊息的內容中。

`openssl_pkcs7_encrypt()` 會建立整個加密部分,因此,如果您在 infile 中不包含任何標頭,那麼除非您將檔案的第一行設為空白行,否則您會發現您的部分訊息可能會被視為標頭。

在呼叫 `openssl_pkcs7_encrypt()` 時,「From」S/MIME 標頭的編碼方式也存在錯誤。

因此,要使範例 100% 正確工作,需要讀取如下內容

// 您想要加密並傳送給您的秘密探員的訊息
// 在該領域,稱為 nighthawk。您有他的憑證
// 在檔案 nighthawk.pem 中
//
// 請注意,由於我沒有在郵件的安全部分中提供任何標頭,因此第一行必須為空白。
$data = <<<EOD

Nighthawk,

最高機密,僅供您瀏覽!

敵人正在逼近!請在早上 8:30 在咖啡館與我會面
領取您的偽造護照!

總部
EOD;

// 載入金鑰
$key = implode("", file("my.pem"));

// 將訊息儲存到檔案
$fp = fopen("msg.txt", "w");
fwrite($fp, $data);
fclose($fp);

// 加密
if (openssl_pkcs7_encrypt("msg.txt", "enc.txt", $key,
array("To" => "you@yourdomain.com", // 鍵控語法
"From" => "HQ <hq@cia.com>", // 索引語法
"Subject" => "僅供瀏覽")))
{
// 訊息已加密 - 發送!
exec(ini_get("sendmail_path") . " < enc.txt");
}

現在,我想做一些其他增強功能。我的電子郵件包含 HTML 內容,並且必須在電子郵件客戶端中顯示時進行格式化,而且我也想使用臨時檔案名稱,以允許多個使用者同時使用該指令碼。最後,我想在之後移除這些臨時檔案。

以下是範例如何透過這些額外增強功能結束

<?

// 您想要加密並傳送給您的秘密探員的訊息
// 在該領域,稱為 nighthawk。您有他的憑證
// 在檔案 my.pem 中
//
// 請注意 Content-type 標頭後的空白行
//
$data = <<<EOD
MIME-Version: 1.0
Content-type: text/html; charset=iso-8859-1

<html>
<b>Nighthawk</b>,
<h1>最高機密,僅供您瀏覽!</h1>
<p>敵人正在逼近!請在早上 8:30 在咖啡館與我會面
領取您的偽造護照!</p>
<p>總部</p>
</html>
EOD;

// 載入金鑰
$key = implode("", file("my.pem"));

// 產生唯一的臨時檔案名稱。使用 .txt 作為純文字版本,並使用 .enc 作為加密版本。
$clearfile = tempnam("temp","email") . ".txt";
$encfile = $clearfile . ".enc";
$clearfile .= ".txt";

$fp = fopen($clearfile, "w");
fwrite($fp, $data);
fclose($fp);

// 加密
if (openssl_pkcs7_encrypt($clearfile,$encfile, $key,
array("To" => "you@yourdomain.com", // 鍵控語法
"From" => "HQ <hq@cia.com>", // 索引語法
"Subject" => "僅供瀏覽")))
{
// 訊息已加密 - 發送!
exec(ini_get("sendmail_path") . " < $encfile");

};
// 現在刪除臨時檔案
unlink($clearfile);
unlink($encfile);

?>
-1
msisolak at yahoo dot com
22 年前
對於那些嘗試從 Windows 使用此功能並使用 Outlook 或 Outlook Express 中的金鑰的人來說,要弄清楚如何以 OpenSSL 尋找的格式匯出金鑰可能很棘手。由於所有(至少所有 Microsoft)產品都共用一個通用金鑰存放區,因此從 IE 匯出金鑰比從 Outlook 匯出更容易。

在 IE 中,選取工具 -> 網際網路選項,然後選取「內容」索引標籤,並按一下「憑證」按鈕。從列表中選取您的憑證,然後按一下「匯出」按鈕。要加密電子郵件,您只需要以「Base-64 編碼 X.509 (.CER)」格式匯出您的公開金鑰。此程序建立的檔案可以直接用作使用 openssl-pkcs7-encrypt 進行 S/MIME 加密的金鑰檔案。
-2
Anonymous
8 年前
範例程式碼是錯誤的(至少在 4.2.0 版本中)。`recipcerts` 參數可以是 base64 編碼金鑰檔案的實際文字,也可以是「file://...」格式的檔案名稱。一般路徑將無法運作(OpenSSL 會嘗試將路徑用作實際憑證)。上述程式碼的運作方式為

<?php
// 您想要加密並發送給您的秘密特務的訊息
// 在外勤,代號為夜鷹。您在 nighthawk.pem 檔案中有他的憑證
$data = <<<EOD
夜鷹
,

最高機密僅供您閱覽

敵人正在逼近早上 8:30 在咖啡廳與我會面
領取您偽造的護照


總部
EOD
;

// 載入金鑰
$key = implode("", file("my.pem"));

// 將訊息儲存到檔案
$fp = fopen("msg.txt", "w");
fwrite($fp, $data);
fclose($fp);

// 加密訊息
if (openssl_pkcs7_encrypt("msg.txt", "enc.txt", $key,
array(
"To" => "example@example.com", // 鍵值語法
"From: HQ <hq@cia.com>", // 索引語法
"Subject" => "Eyes only")))
{
// 訊息已加密 - 發送它!
exec(ini_get("sendmail_path") . " < enc.txt");
}
?>

[您也可以傳遞 recipcerts 值的陣列,但我沒用過,所以我不知道它會預期什麼。]
-4
msisolak at yahoo dot com
22 年前
範例程式碼是錯誤的(至少在 4.2.0 版本中)。`recipcerts` 參數可以是 base64 編碼金鑰檔案的實際文字,也可以是「file://...」格式的檔案名稱。一般路徑將無法運作(OpenSSL 會嘗試將路徑用作實際憑證)。上述程式碼的運作方式為

<?php
// 您想要加密並發送給您的秘密特務的訊息
// 在外勤,代號為夜鷹。您在 nighthawk.pem 檔案中有他的憑證
$data = <<<EOD
夜鷹,

最高機密,僅供您閱覽!

敵人正在逼近!早上 8:30 在咖啡廳與我會面
領取您偽造的護照!

總部
EOD;

// 載入金鑰
$key = implode("", file("my.pem"));

// 將訊息儲存到檔案
$fp = fopen("msg.txt", "w");
fwrite($fp, $data);
fclose($fp);

// 加密訊息
if (openssl_pkcs7_encrypt("msg.txt", "enc.txt", $key,
array(
"To" => "example@example.com", // 鍵值語法
"From: HQ <hq@cia.com>", // 索引語法
"Subject" => "Eyes only")))
{
// 訊息已加密 - 發送它!
exec(ini_get("sendmail_path") . " < enc.txt");
}
?>

[您也可以傳遞 recipcerts 值的陣列,但我沒用過,所以我不知道它會預期什麼。]
To Top