wiki:OpenPgp

Wamailer et OpenPGP

Présentation

Wamailer supporte désormais la signature numérique et le chiffrement des emails au travers du format OpenPGP/MIME décrit dans la RFC 3156 et de l’excellent programme GnuPG. La classe SecureMail vient s’intercaler entre la classe Email et votre programme. Ainsi, l’API est la même qu’avec la classe Email seule. Vient s’y ajouter entre autre les méthodes SecureMail::sign() et SecureMail::encrypt() qui permettent respectivement de signer l’email et de le chiffrer (et non pas crypter).

Les chiffrements symétrique aussi bien qu’asymétrique sont supportés. Vous pouvez aussi signer et chiffrer votre email. Les deux opérations ne sont pas exclusives.

Exemples

Reprenons tout simplement le premier exemple de la page WikiStart et ajoutons la signature et le chiffrement de l’email :

<?php
require 'mailer.class.php';
require 'securemail.class.php';

$email = new SecureMail();
$email->addRecipient("bobe <my@address.tld>");
$email->setSubject("Ici, le sujet");
$email->setTextBody("Ici, le message");

$email->sign();
$email->encrypt('bobe@example.org');
Mailer::send($email);
?>

Il suffit d’ajouter les appels aux méthodes SecureMail::sign() et SecureMail::encrypt() et le tour est joué.

Dans cet exemple, on ne fournit pas d’identifiant de clé ni de passphrase à la méthode SecureMail::sign(). GnuPG utilisera dans ce cas la clé par défaut du trousseau de clé. Il faudra en outre que cette clé ne soit pas protégée par un passphrase. La FAQ de gnupg.org fournit un court howto pour créer une sous-clé sans passphrase et ainsi ne pas mettre en péril la sécurité de sa paire de clés: http://www.gnupg.org/(en)/documentation/faqs.html#q4.14

Si vous souhaitez spécifier la clé à utiliser, passez-là en premier argument de la méthode SecureMail::sign(). Si vous souhaitez spécifier un passphrase (mauvaise idée de laisser traîner ainsi son passphrase), passez-le en deuxième argument de la méthode SecureMail::sign().

Passons maintenant à la méthode SecureMail::encrypt(). Cette méthode prend deux arguments, dont le premier est obligatoire. Le premier argument doit être la clé publique (ou toute information permettant d’identifier cette clé; nom, adresse email associée à cette clé, …) du destinataire. Votre email est à destination de plusieurs personnes ? Pas de problème, vous pouvez passer un tableau des clés publiques à utiliser lors du chiffrement.

Par défaut, le chiffrement est asymétrique. Cependant, si vous passez la valeur de la constante de classe SecureMail::S_ENCRYPTION en deuxième argument de la méthode SecureMail::encrypt(). Le chiffrement symétrique sera utilisé. Dans ce cas, c’est le passphrase de déchiffrement qui devra être passé en premier argument.

Un exemple de chiffrement symétrique :

<?php
require 'mailer.class.php';
require 'securemail.class.php';

$email = new SecureMail();
$email->addRecipient("bobe <my@address.tld>");
$email->addRecipient("Stefan <other@address.tld>");
$email->setSubject("Ici, le sujet");
$email->setTextBody("Ici, le message");
$email->attach('/path/to/file', 'MyFile');

$email->encrypt('mypassword', SecureMail::S_ENCRYPTION);
Mailer::send($email);
?>

Vous pouvez également signer les emails chiffrés symétriquement, mais seulement si la clé utilisée pour la signature ne nécessite pas de passphrase. C’est une limitation de GnuPG dans ses options de ligne de commande (du moins, toutes mes recherches sur ce point sont restées infructueuses).

Les autres méthodes et attributs de la classe :

  • L’attribut $homedir doit contenir le chemin vers le trousseau de clés à utiliser. Par défaut, sa valeur est null, ce qui signifie que GnuPG utilisera le trousseau de clés de l’utilisateur exécutant le script. Si vous spécifiez un autre trousseau de clés, assurez-vous de bien y avoir un accès en lecture (et en écriture ?)
  • L’attribut $tmpdir est le répertoire des fichiers temporaires du système. La valeur par défaut est /tmp.
  • L’attribut $digest_algo est l’algorithme de hashage à utiliser pour la signature de l’email. La valeur par défaut est sha1
  • L’attribut $cipher_algo est l’algorithme de chiffrement à utiliser pour l’opération de chiffrement de l’email. La valeur par défaut est null. GnuPG utilise alors son algorithme par défaut.
  • L’attribut $gpg_bin est le chemin vers l’exécutable du programme GnuPG.
  • La méthode SecureMail::initialize() permet de remettre à zéro les attributs volatiles de la classe. À utiliser si vous réutiliser le même objet Email pour un autre envoi.
  • Les deux constantes de classe SecureMail::A_ENCRYPTION et SecureMail::S_ENCRYPTION utilisables avec la méthode SecureMail::encrypt() (Le A de A_ENCRYPTION pour ASYMMETRIC et le S de S_ENCRYPTION pour SYMMETRIC ;¬))

Liens

  • GnuPG -- Le site officiel du programme GnuPG
  • RFC 3156 -- La RFC sur le format OpenPGP/MIME de sécurisation des emails
Last modified 11 years ago Last modified on Sep 23, 2006, 4:44:33 PM