< návrat zpět

Diskuse


Téma: Šifrovat zprávy rss

Zaslal/a 22.9.2014 11:17

Dobrý den, trochu se v tom ztrácím, nechávám si z mailového formuláře (https) posílat zprávy s přílohou. Zpráva se posílá do emailové schránky, chtěl bych ji poslat jako zašifrovaný email (certifikátem S/MIME), nejspíše funkcí openssl_pkcs7_encrypt ()? S obsahem zprávy se pracuje v remote/hcm/mform.php, ale co a kde tam s tím provést? Díky 1

Zaslat odpověď >

#019085
Tak jo, mám to, je potřeba si důkladně pročíst manuál i poznámky u openssl_pkcs7_encrypt (certifikát musí být kódovaný Base-64, zašifrovat jde tou funkcí soubor, ne data ...). V CMS pak upravit remote/hcm/mform.php (řešil jsem to raději vytvořením vlastního HCM modulu, abych nezničil originály), šifrovat se musí těsně před odesláním, když už je celá zprávy přichystaná, před funkcí mail(), nejdřív převést celou zprávu na soubor, ještě si pak trochu pohrát s hlavičkami, protože některé jsou duplicitní.
#019107
Šlo by to v rámi extend události sys.mail, viz dokumentace.
#019110
Poskytneš část kódu toho šifrování?
Udělal bych na to rychlý extend.
#019116
@Landsman
V souboru remote/hcm/mform.php na řádku 66 je potřeba si izolovat hlavičky pro mail
$headers_msg = $headers;
Vlastní kód je potom na řádku 86

// Encrypt email with PKCS7
// load key - měl by být ve formátu Base-64, nikoliv DER
$key = implode("", file("key.cer"));

// save message to file - tady může být kritické místo, sám to na serveru ukládám
// mimo webový prostor absolutní adresou /.., nebo aspoň to nakonec chce zabránit
// přístupu k TXT souborům ve složce pomocí .htaccess nebo vymyslet jinou fíčuru na ochranu?

file_put_contents ("msg.txt",$headers . $body);

// šifrování
openssl_pkcs7_encrypt("msg.txt", "enc.txt", $key,
array("To" => "recipient@mail.foo", // keyed syntax
"From" => $sender,
"Subject" => $subject),0, OPENSSL_CIPHER_3DES); //viz dokumentace, v cipherid od PHP v. 5.4.0 může být pokročilejší šifrování AES

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

// vymazat obsah dočasných souborů
file_put_contents ("msg.txt","");
file_put_contents ("enc.txt","");

// separate header and body, to use with mail function
// unfortunate but required, else we have two sets of headers
// and the email client doesn't decode the attachment
$parts = explode("\n\n", $data, 2);

// poskládat mailovou hlavičku
$headers_msg = $parts[0] . "\n" . $headers_msg;

// encryption end


Řádek 88 upravíme (musíme použít hlavičky šifrovaného mailu rozeznatelné poštovními klienty, poslat šifrované tělo mailu):

if (_mail($receiver, $subject, $parts[1], $headers_msg)) {
#019118
@Landsman Mohlo by být šikovné někde (např. v administraci) mít možnost si nahrát k šifrování nový certifikát (kódování Base-64 je plaintext, stačilo by obyčejné textové vstupní pole).
#019126
Díky za kód,

extend na sys.mail mám hotový pro hezké html maily, tak tam toto pouze variabilně přidám a otestuji.