digital-signature

Het digitaal ondertekenen en versleutelen van e-mails voorkomt het onderscheppen, lezen en wijzigen van e-mails door derden. Het geeft de ontvanger de garantie dat het bericht ongewijzigd en van jou afkomstig is. Als de ontvanger ook een certificaat heeft, kun je versleutelde e-mail verzenden waardoor deze alleen voor de ontvanger te lezen is.

Ik gebruik deze functionaliteit al geruime tijd en eerlijk gezegd was ik verbaasd dat het nog geen standaard praktijk is geworden voor bedrijven. Het zou het phishing-probleem volgens mij grotendeels oplossen.

Onlangs kreeg ik de vraag of dit ook op een webserver mogelijk zou zijn, bijvoorbeeld bij het geautomatiseerd versturen van e-mail. Hierop besloot ik dit eens uit te zoeken. Het blijkt nog niet eens zo moeilijk om dit in PHP te realiseren.

Stap 1: Een certificaat verkrijgen

Een e-mail certificaat kun je bij verschillende aanbieders aanschaffen. Er zijn ook aanbieders van gratis e-mail certificaten en Comodo is zo’n aanbieder van gratis e-mail certificaten. Het certificaat dat zij aanbieden is 1 jaar geldig. Daarna moet er een nieuw certificaat aangeschaft worden. Ik heb het certificaat gedownload op een MacBook met de Safari webbrowser. Na het volgen van de instructies werd er een bestand, genaamd CollectCC.p7s gedownload.

Stap 2: Het certificaat exporteren

Wanneer je op dit bestand klikt, vraagt MacOS of certificaten in dit bestand moeten worden toegevoegd aan de sleutelhanger-applicatie op de Mac. Klik hier op Voeg toe. Je hoeft in dit venster verder niets in te stellen. Op nu de sleutelhanger-applicatie en selecteer aan de linkerzijde Mijn Certificaten.

keychain_certificates

Klik nu met de rechter muisknop (of CTRL-klik) op het certificaat en kies de optie Exporteer sleutel.

keychain_certificate_p12

Geef het bestand een naam die je gemakkelijk kunt onthouden, bijvoorbeeld emailcertificate. Kies Personal Information Exchange (.p12) als bestandsstructuur. Wanneer je nu op Bewaar klikt, wort je gevraagd een wachtwoord in te voeren waarmee het geëxporteerde certificaat wordt beveiligd.

Stap 3: Spiltsen naar certificaat en private sleutel

Hiervoor open je de Terminal, aangezien we de volgende commando’s command-line gaan uitvoeren. Eerst gaan we de private sleutel maken:

openssl pkcs12 -in emailcertificate.p12 -nocerts -out <emailadres>.key

Vervang <emailadres> door het mailadres waarvoor het certificaat was aangemaakt. Na het uitvoeren van dit commando wordt je eerst gevraagd om een wachtwoord om te importeren. Dit is het wachtwoord dat je hebt opgegeven bij het exporteren vanuit de sleutelhanger-applicatie. Vervolgens moet je (tweemaal) een wachtwoord ingeven waarmee je je private sleutel wilt beveiligen.

Hierna gaan we het certificaat aanmaken met het volgende commando:

openssl pkcs12 -in Certificaten.p12 -clcerts -nokeys -out <emailadres>.crt

Ook hier moet je weer het import-wachtwoord invoeren.

We hebben nu twee bestanden gecreëerd: <emailadres>.key en <emailadres>.crt

Stap 4: De code

Voor het versturen van de mail, gaan we nu een stukje PHP-code schrijven. Natuurlijk kunnen we alle code zelf schrijven, maar ik heb er voor gekozen om gebruik te maken van PHPMailer, die een hoop werk al voor ons doet. PHPMailer is eenvoudig te installeren via Composer:

composer require phpmailer/phpmailer

Nadat we PHPMailer gedownload en geïnstalleerd hebben, gaan we de code schrijven:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

//Laad composer's autoloader
require 'vendor/autoload.php';

$mail = new PHPMailer(true);
try {
$mail->SMTPDebug = 2;
$mail->Host = '<hostname_van_je_stmp_server>';

$mail->setFrom('<email_adres_van_je_certificaat>', '<naam_van_de_verzender>');
$mail->addAddress('<email_adres_van_de_ontvanger>', '<naam_van_de_ontvanger>');

$mail->isHTML(true);
$mail->Subject = 'Here is the subject';
$mail->Body = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

$mail->sign(
__DIR__.'/<emailadres>.crt', //De locatie van je certificaat bestand
__DIR__.'/<emailadres>.key', //De locatie van je private sleutel bestand
//Het onderstaande wachtwoord is het wachtwoord van je private sleutel, NIET het import-wachtwoord!
'<wachtwoord_van_je_private_sleutel>'
);

$mail->send();
echo 'Message has been sent';
} catch (Exception $e) {
echo 'Message could not be sent. Mailer Error: ', $mail->ErrorInfo;
}
?>

Als alles goed gegaan is, krijg je nu een ondertekende mail binnen:

signed_email

Reacties