Nachrichten in PHP unterschreiben und verschlüsseln

February 17th, 2010 by author Leave a reply »

“Kampf der NSA” oder andere Beweggründe könnten einen auf die Idee bringen seine E-Mails zu verschlüsseln.

Wie man einen eigenen (kostenlosen) Key erstellt und diesen in Thunderbird nutzt, will ich in einem anderen Tutorial aufzeigen und mich hier ausschließlich auf PHP und dem Signieren und Verschlüsseln von E-Mails konzentrieren.

Um eine Nachricht zu signieren brauchen wir auf dem Server den eigenen privaten Schlüssel. Dieser ist im Idealfall bereits vorhanden und man kennt das Passwort zum Entschlüsseln. Will man also eine Nachricht mittels PHP signieren und versenden benötigt man den folgenden Code:
// Die Kopfdaten fuer die E-Mail
$headers = array('To' => 'empfaenger@empfaengerhost.tld',
'From' => 'absender@absenderhost.tld',
'Subject' => 'Die Nachricht ist wirklich von mir!');
// Nachricht signieren - Die Nachricht liegt in klartext.txt vor, die Datei könnte man mittels fwrite schreiben
openssl_pkcs7_sign('klartext.txt','signiert.txt','file://signingcert.pem',array('file://privateKey.pem','passwort'),$headers);
// Die Datei liegt nun signiert unter signiert.txt

Hier endet der Code erstmal, weil es jetzt darauf ankommt, wie man die Nachricht versenden will. Man kann dies SENDMAIL erledigen lassen und dann einfach auf exec(ini_get("sendmail_path") . " < signiert.txt"); zurückgreifen oder man nutzt die php-Funktion mail.
$data = file_get_contents('signiert.txt');
$splitData = explode("\n\n", $data, 2);
mail($headers['To'], $headers['Subject'], $splitData[1], $splitData[0]);

Will man die signierte Nachricht nun verschlüsseln geht man ein klein bisschen anders vor. Erstmal benötigt man den öffentlichen Schlüssel des Empfängers! Beim Aufruf von openssl_pkcs7_sign übergibt man für $headers ein leeres Array und fügt noch den folgenden Code hinten an.
// Lade den öffentlichen Schlüssel des Empfängers
$empfaengerPem = file_get_contents('empfaenger_empfaengerhost_tld.pem');
// Signierte Nachricht verschlüsseln
openssl_pkcs7_encrypt('signiert.txt', 'verschluesselt.txt',$empfaengerPem ,$headers,0,1);
// Die Nachricht liegt verschlüsselt unter verschluesselt.txt vor

Die verschlüsselte Nachricht kann nun entsprechend der Anleitung weiter oben entweder mittels SENDMAIL oder der php-Funktion mail versendet werden.

VN:F [1.9.22_1171]
Rating: 7.3/10 (4 votes cast)
VN:F [1.9.22_1171]
Rating: +2 (from 2 votes)
Nachrichten in PHP unterschreiben und verschlüsseln, 7.3 out of 10 based on 4 ratings
Advertisement

Leave a Reply