Skip to content
Snippets Groups Projects
pgp.md 17.58 KiB

PGP / GPG

PGP

  • Chiffrement asymétrique
  • Phil Zimmermann
    • 1991
    • munition / cryptowar
  • PGP abandonné
  • GPG GnuPG sous GPL devient est le standard

Gérer son envrionnement GPG

gpgenv

  • Simplifie la gestion des clés en créant des environnements temporaires
    • Permet de repartir de 0 simplement
$ wget http://m4z3.me/gpgenv -O /tmp/gpgenv
$ source  /tmp/gpgenv
gpg --help

gpgenv

$ gpgenv create
new GNUPGHOME=/tmp/gnupg-Lw4Ck
  • Crée un environnement (env) vierge localisé dans /tmp/gnupg-Lw4Ck.
$ gpgenv cd
  • permet de se positionner dans le nouveau répertoire

gpgenv

$ gpgenv backup ~/Bureau/batman.tgz
  • permet de sauvegarder son env dans un archive
$ gpgenv restore ~/Bureau/batman.tgz
Restored backup in /tmp/gnupg-ZuXYw
To activate it, use
    gpgenv use /tmp/gnupg-ZuXYw
  • permet de restaurer un env à partir d'une archive
$ gpgenv use /tmp/gnupg-ZuXYw && gpgenv cd
  • permet d'utiliser l'env restauré et de se positionner dans le répertoire associé

Gérer ses clés GPG

Création d’une clé PGP

  • Création de la paire de clés de l’utilisateur
    • un « certificat » avec
      • la clé publique
        • signée avec la clé privée
      • identité de l’utilisateur

Création d’une clé PGP maître

$ gpg --full-gen-key # or --gen-key
gpg (GnuPG) 2.1.11; Copyright (C) 2016 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Sélectionnez le type de clés désiré :
   (1) RSA et RSA (par défaut)
   (2) DSA et Elgamal
   (3) DSA (signature seule)
   (4) RSA (signature seule)
Quel est votre choix ? 1

Création d’une clé PGP maître

  • Choisir une taille de clé maximale
  • Choisir une durée de vie infinie
    • elle doit être valide pour être utilisée
    • plus la durée de vie est nogue
      • plus on récolte de signature
  • Saisir son identité
  • Choisir un mot de passe fort

Lister les clés

$ gpg --list-keys
pub   rsa4096/3E5AC6A0 2018-01-09 [SC]
uid        [  ultime ] Batman (clés à usage professionnel) <batman@batcave.com>
sub   rsa4096/31C5E7B9 2018-01-09 [E]
sub   rsa4096/DD6A21D4 2018-01-09 [S]
  • liste toutes les clés de l'environnement
* 3E5AC6A0, batman@batcave.com sont 2 ids de la clé public * 31C5E7B9 et DD6A21D4 sont les ids de la clé de chiffrement et de signature
$ gpg --list-private-keys
  • liste toutes les clés privées de l'environnement
    • dont on a le mot de passe

Fonctions des clés

Constant Character
PUBKEY_USAGE_SIG S
PUBKEY_USAGE_CERT C
PUBKEY_USAGE_ENC E
PUBKEY_USAGE_AUTH A

Authentication

Exporter une clé GPG

$ gpg --export --armor batman@batcave.com > batman.pub.asc
$ gpg --export --armor 3E5AC6A0 > batman.pub.asc
$ gpg --export --armor DD6A21D4 > batman.pub.asc
  • exportent le même certificat (celui de la clé maître)
  • ASCII-armor encrypted or signed output
gpg --export-secret-keys --armor \
    batman@batcave.com > batman.asc
  • exporte la clé privée
    • le mot de passe est nécessaire

Importer une clé

$ gpg --import batman.asc
  • s'il s'agit d'une clé privée
    • le mot de passe sera demandé
    • les fonctionnalités de la clé seront ensuite utilisables
$ gpg --import robin.pub.asc
  • s'il s'agit d'un certificat
    • aucun mot de passe ne sera demandé
    • la clé pourra être utilisée pour chiffrer à destination du détenteur de la clé

Editer une clé / Durcir le hashage

$ gpg --edit-key batman@batcave.com
$ gpg> setpref SHA512 SHA384 SHA256 SHA224 \
       AES256 AES192 AES CAST5 ZLIB BZIP2 \
       ZIP Uncompressed
$ gpg> save
  • il faut bien sauvegarder avant de quitter le mode édition

Editer une clé clé maître / Ajouter une identité

$ gpg --edit-key batman@batcave.com
$ gpg> adduid
Nom réel : Bruce Wayne
Adresse électronique : bruce.wayne@gmail.com
Commentaire : clé à usage personnel
Vous utilisez le jeu de caractères « utf-8 ».
Vous avez sélectionné cette identité :
    « Bruce Wayne (clé à usage personnel) <bruce.wayne@gmail.com> »

Changer le (N)om, le (C)ommentaire, l\'(A)dresse électronique
ou (O)ui/(Q)uitter ? O
$ gpg> save
  • Toutes les identités sont liées dans le certificat
    • pour utiliser GPG en tant que Bruce Wayne il faudra générer une autre clé maître

Editer une clé clé maître / Ajouter une photo

$ gpg --edit-key batman@batcave.com
$ gpg> addphoto
$ gpg> save
  • l'image doit être petite pour garder une taille de clé raisonnable
    • 240x288 is a good size to use

Sous clé

  • Permet de conserver sa clé maître déconnectée

    • Mais de pouvoir utiliser la foncationnalités de la sous clé
      • idéal pour gérer une clé par appareil (mobile, laptop, fix, ...)
  • quel est l'intérêt d'une sous clé de chiffrement?

  • quel est l'intérêt d'une sous clé de signature?

Editer une clé / Ajouter une sous clé

$ gpg --edit-key batman@batcave.com
$ gpg> addkey
Sélectionnez le type de clés désiré :
   (3) DSA (signature seule)
   (4) RSA (signature seule)
   (5) Elgamal (chiffrement seul)
   (6) RSA (chiffrement seul)
Quel est votre choix ? 4
  • choisir la fonctionnalité
  • choisir une durée de vie
  • choisir un nouveau mot de passe fort
$ gpg> save

Voir la nouvelle sous clé

$ gpg --list-secret-keys
/tmp/gnupg-RL2R8/pubring.kbx
----------------------------
sec   rsa4096/3E5AC6A0 2018-01-09 [SC]
uid        [ inconnu ???] Batman (clés à usage professionnel) <batman@batcave.com>
ssb   rsa4096/31C5E7B9 2018-01-09 [E]
ssb   rsa4096/DD6A21D4 2018-01-09 [S]

Exporter une sous clé

L'enjeu est de rendre la clé maître inutilisable

$ gpg --export-secret-subkeys --armor DD6A21D4 batman@batcave.com > batman@batcave.com.mobile.private.subkey
  • l'id de la sous clé doit être précisé sans quoi toutes les sous clés sont exportées
  • --armor ne fonctionne pas

Autre stratégie

gpg --delete-secret-key batman@batcave.com
gpg --export-secret-keys --armor batman@batcave.com > batman.mobile.asc
  • ici --armor fonctionne

Voir la nouvelle sous clé "nettoyée"

$ gpg --list-secret-keys
/tmp/gnupg-RL2R8/pubring.kbx
----------------------------
sec#  rsa4096/3E5AC6A0 2018-01-09 [SC]
uid        [ inconnue ???] Batman (clés à usage professionnel) <batman@batcave.com>
ssb   rsa4096/31C5E7B9 2018-01-09 [E]
ssb   rsa4096/DD6A21D4 2018-01-09 [S]
  • '#' signifie que la clé maître est inutilisable \o/
    • --edit-key refusera de sauver les opérations

Publication d'un certificat

Partout

  • sur une page web
  • sur une carte de visite
  • en pièce jointe ou dans le corps d'un message

Serveurs de clé PGP

  • existent depuis que gpg existe
  • http://pgp.mit.edu/ est un des plus populaires
    • informations synchrones entre tous les Serveurs
      • suppression quasi impossible
        • beaucoup de clés obsolètes (non révoquées et non maîtrisées)
    • n'importe qui peut publier des clés publiques pour n'importe quelle identité
      • aucune vérification

Serveur de clé 2nd génération

  • PGP Global Directory
    • vérification de la maîtrise du (des) mail(s) associé(s) au certificats à la création
    • confirmation d'existence de la clé envoyée au(x) mail(s) associé(s) au certificats à intervalles réguliers
  • non synchronisés avec les serveurs 1ère génération

Keybase.io

  • Keybase.io
    • récent
    • basé sur PGP
    • 2 parties
      • publication de la clé publique
        • confirmation via différents réseaux sociaux
      • correspondance / partage chiffré
        • nécessite l'import de la clé privée :/

Keybase.io ... the right way

KeyBase - host private key

Une autre fois peut être ;)

Keybase.io ... the right way

KeyBase - prove you have the private key

Keybase.io ... the right way

KeyBase - prove you have the private key(2)

Hardocre mode \o/

et une sous clé dédiée?

une clé PGP sur une carte de visite?

Révocation

  • secret ou clé perdu
  • secret ou clé compromis
    • l'attaquant peut
      • écrire en se faisant passer pour le propriétaire des clés
        • signer en général
      • lire tout message (passé et avenir) chiffré avec la clé publique

Révocation

  • révoquer la clé en question
    • distribuer la clé révoquée à tout ceux qui l'utilisent
      • appelé aussi certificat de révocation

Révocation de la clé maître

  • Il faut anticiper
    • créer le certificat de révocation dés la création de la clé
$ gpg --output batman.revoke.asc --gen-revoke batman@batcave.com

sec  4096R/0DCD0D14 2017-09-04 Batman (clés à usage professionnel) 

Faut-il créer un certificat de révocation pour cette clés ? (o/N) o
choisissez la cause de la révocation :
  0 = Aucune raison indiquée
  1 = La clés a été compromise
  2 = La clés a été remplacée
  3 = La clés n'est plus utilisée
  Q = Annuler

Révocation d'une sous clé

  • créer un certificat de révocation
    • à tout moment avec la clé maître
$ gpg --output batman.mobile.revoke.asc --gen-revoke batman@batcave.com

Publication du certificat de révocation

$ gpg --import batman.mobile.revoke.asc # ou batman.revoke.asc
$ gpg --keyserver pgp.mit.edu --send-keys 6382285E
  • En cas de perte ou de compromission uniquement
    • sinon la clé est invalidée
  • la clé de révocation est à garder en lieu sûr
    • mais à un autre endroit que la clé maître

Utiliser ses clés GPG

Chiffrer

$ gpg  --encrypt --armor --output msg.gpg \
       --recipient robin@batcave.com msg
  • La clé (publique) robin@batcave.com doit faire partie du trousseau
    • importation au préalable
    • --recipient permet de spécifier la clé publique à utiliser

Déchiffrer

$ gpg --decrypt msg.gpg
  • Effectué avec la clé privée robin@batcave.com
    • nécessite le mot de passe de cette clé privée

Signer

  • La signature
    • certifie un document à date
    • utilise la clé privée de l'émetteur
      • non répudiation
$ gpg --output doc.sig --sign doc
$ gpg --output doc --decrypt doc.sig
gpg: Signature made Fri Jun  4 12:02:38 1999 CDT using DSA key ID BB7576AC
gpg: Good signature from "Alice (Judge) <alice@cyb.org>"
  • doc.sig contient le document compressé (format binaire) et signé
    • pas pratique pour une ISO par exemple

Signature en claire

$ gpg --clearsign doc

Evite la compression

  • document suivi d'une signature ASCII
  • --local-user permet de spécifier la clé privée à utiliser

Signature en claire

gpg --output doc.sig --detach-sig doc

produit la signature du fichier sans le fichier

gpg --verify doc.sig doc

le fichier et la signature sont nécessaires pour vérifier l'intégrité et l'authentification

Gérer son réseau de confiance

Configurer un serveur de clef

Dans .gnupg/gpg.conf

keyserver pool.sks-keyservers.net

Ou directement dans la ligne de commande

$ gpg --keyserver pgp.mit.edu --search-keys pascal.lafourcade@udamail.fr

Garder son trousseau à jour

$ gpg --refresh-keys

Automatisable via cron

# mettre à jour mes clefs OpenPGP à chaque jour, à midi
0 12 * * * /usr/bin/gpg --refresh-keys > /dev/null 2>&1

Importer un clé à partir d'un serveur de clé public

gpg --keyserver pgp.mit.edu --recv-key 0EBE8000

Réseau de confiance

  • Les signatures sont publiques
    • on sait qui (quelle clé) a signé la clé de qui
      • soit qui fait confiance à qui (à quelle clé)
    • 5.5 est le nombre de noeuds moyen entre 2 utilisateurs de PGP
      • une signature n'est pas symétrique

sig2dot GPG/PGP Keyring Graph Generator

Réseau de confiance

Avant de signer une clé il faut vérifier qu'elle appartient bien à une personne physique

  • il faut
    • échanger la clé ou l'empreinte de la clé physiquement
    • faut vérifier les papiers d'identité de la personne

Fingerprint

Empreinte de clé

  • 2 clés avec le même fingerprint sont identiques
  • similarité vérifiable par un humain
    • permet de vérifier une clé publique
$ gpg --fingerprint robin@batcave.com

ou

$  gpg --edit-key robin@batcave.com
gpg> fpr
pub  1024D/9E98BC16 1999-06-04 Blake (Executioner) 
             Fingerprint: 268F 448F CCD7 AF34 183E  52D8 9BDE 1A08 9E98 BC16

Signature d’une clé

Une clé PGP peut avoir plusieurs signatures

  • Alice fourni à Bob l’empreinte de sa clé publique
  • Bob vérifie que l’empreinte correspond
  • Bob signe la clé publique avec sa clé privée
  • Bob envoie à Alice clé publique d'Alice signée
  • Alice importe sa clé dans son trousseau
    • La clé existe déjà, seule la nouvelle signature est ajoutée

http://openpgp.vie-privee.org/gpg-intro-5.html

Signer une clé publique

$  gpg --edit-key robin@batcave.com
gpg> sign

ou

$ gpg --sign-key robin@batcave.com
  • en cas d'UIDs multiples on peut
    • signer tous les UIDs
    • ou choisir celles que l'on souhaite signer
  • lsign permet de signer localement (non exportable)

Propager la signature

  • La clé un fois signée doit être renvoyée à son propriétaire
  • Il est également possible de la publier directement sur un serveur de clé première génération
    • le propriétaire n'est alors plus maître des signatures de sa clé
      • ce n'est pas une bonne pratique

Lister les signatures

$ gpg --list-sigs robin@batcave.com
pub  1024D/CE63A2E7 2000-02-23 Benoit <benoit@parinux.org>
sig        5ED61FDA 2000-06-06  [User id not found]
sig        CE63A2E7 2000-02-23  Benoit <benoit@parinux.org>
sig        B4C5FE7F 2001-07-18  [User id not found]
sub  2048g/B5A97C83 2000-02-23
sig        CE63A2E7 2000-02-23  Benoit <benoit@parinux.org>

ou

$ gpg --list-sigs robin@batcave.com
gpg> sigs
  • Sans id de clé gpg --list-sigs liste toutes les clés avec toutes leurs signatures
  • Les clés non importées dans le trousseau apparaissent en [User id not found]

Vérifier les signatures

$ gpg --check-sigs robin@batcave.com
pub  1024D/CE63A2E7 2000-02-23 Benoit <benoit@parinux.org>
sig?       5ED61FDA 2000-06-06  
sig!       CE63A2E7 2000-02-23  Benoit <benoit@parinux.org>
sig!       B4C5FE7F 2001-07-18  Olivier Berger <oberger@april.org>
sub  2048g/B5A97C83 2000-02-23
sig!       CE63A2E7 2000-02-23  Benoit <benoit@parinux.org>

ou

$ gpg --list-sigs robin@batcave.com
gpg> check
  • Sans id de clé gpg --check-sigs vérifie toutes les clés avec toutes leurs signatures
  • ? non importées dans le trousseau
  • ! clés publiques du trousseau

Récupérer automatiquement les clés dans le trousseau

#!/bin/sh
echo ""
echo "Mise à jour des clés GnuPG :"
echo ""
for i in $(/usr/bin/gpg --list-keys | grep '^pub' | cut -c 12-19); \
    do /usr/bin/gpg --keyserver pgp.mit.edu --recv-key $i; done

Utiliser la confiance pour valider les clés

gpg --list-sigs robin@batcave.com
gpg> trust
  1. Don't know (unknown default trust level)
  2. I do NOT trust (none)
  3. I trust marginally (marginal)
  4. I trust fully (full)

Utiliser la confiance pour valider les clés

  • --completes-needed
    • nombre de signatures de confiance pleine nécessaires pour qu'une nouvelle clé soit de confiance
      • défaut 1
  • --marginals-needed
    • nombre de signatures de confiance marginale nécessaires pour qu'une nouvelle clé soit de confiance
      • défaut 3

Enigmail

  • Intégration de GPG à Thunderbird
  • UI pour la gestion des clés
  • Attention à la verison de GPG utilisée

openKeyChain

  • Gestionnaire de clés PGP pour android
  • Open source (F-Droid)

k9mail

openpgp.js