web-dev-qa-db-fra.com

Comment signer des fichiers avec des outils de ligne de commande Ubuntu et mes propres clés?

Je souhaite signer certains fichiers de code Python que j'ai écrits, car ils constituent des modules de plug-in pour l'un de mes projets. Pour le distribuer, je veux que l'utilisateur puisse être sûr qu'un plug-in est vérifié et sûr (car il a été écrit par moi-même ou par une personne de confiance) et n'a pas été modifié.

Le logiciel n'est qu'un projet de loisir à code source ouvert. Par conséquent, je ne souhaite pas dépenser d'argent pour acheter un certificat officiel. Au lieu de cela, je suppose que le programme principal est toujours valide et peut être approuvé sans vérification supplémentaire. Si quelqu'un le télécharge depuis un autre emplacement que mon référentiel GitHub, c'est de leur faute.

D'après ce que j'ai lu, la signature est généralement effectuée en créant une paire de clés asymétrique, en calculant une valeur de hachage cryptographique forte (par exemple, SHA-512) à partir du fichier de code, en chiffrant le hachage à l'aide de ma clé privée et en stockant cette signature dans un fichier séparé. être expédié avec le fichier de code original.
Le programme principal devra alors déchiffrer la signature à l'aide de la clé publique enregistrée en texte brut dans le code source du programme principal, calculer la même fonction de hachage du fichier de code, puis la comparer à celle déchiffrée. . S'ils correspondent, le plug-in peut être approuvé.

Alors maintenant ma question:

Comment créer facilement une paire de clés asymétrique forte avec les outils Ubuntu et comment calculer facilement la valeur de hachage cryptographique d'un fichier?
Automatiser le processus de signature dans un script (en utilisant toujours la même clé) serait bien.

13
Byte Commander

Une grande partie de cette réponse provient de Arch Wiki et la documentation de GnuPG . Toutes les recommandations dans cette réponse sont purement à mon avis et doivent être prises avec une tonne de sel.

Création d'une clé PGP

Interface graphique

  1. Ouvrez l'application Mots de passe et clés (aussi appelée seahorsename__), puis cliquez sur + (ou accédez à Fichier -> Nouveau , ou appuyez sur CtrlN) à voir:

    new item dialog for Seahorse

  2. Sélectionnez clé PGP et entrez vos détails. Je personnifie Byte Commander:

    key details dialog

    RSA et 2048 bits conviennent à la plupart des applications. Si vous souhaitez uniquement l'utiliser pour la signature, sélectionnez l'option RSA (signe uniquement) dans le menu déroulant, mais vous n'avez pas besoin de le faire. - ceci peut être manipulé en utilisant subkeys . Vous pouvez laisser un commentaire. Garder une date d'expiration sur votre clé est également utile. Cliquez sur Create.

  3. Entrez un mot de passe assez long (et je veux dire long , mon exemple est court, IMO), puis cliquez sur Ok:

    password entry dialog

    Seahorse ne semble pas avoir de retour, contrairement à la CLI. Attendez pendant un moment, faites ce que vous voulez, pendant que cela recueille l'entropie et crée une clé. Ça peut prendre un moment. Après quoi, vous verrez qu'ils entrent dans la section PGP Keys :

    list of pgp keys

CLI

Pour générer une clé à partir de la ligne de commande, exécutez simplement gpg --gen-key. Il vous demandera les mêmes détails que l'interface graphique:

$ gpg --gen-key 
gpg (GnuPG) 1.4.16; Copyright (C) 2013 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.

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 1y
Key expires at Tuesday 27 September 2016 03:45:19 PM IST
Is this correct? (y/N) y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and E-mail Address in this form:
    "Heinrich Heine (Der Dichter) <[email protected]>"

Real name: Byte Commander
E-mail address: [email protected]
Comment: 
You selected this USER-ID:
    "Byte Commander <[email protected]>"

Change (N)ame, (C)omment, (E)-mail or (O)kay/(Q)uit? o
You need a Passphrase to protect your secret key.

passphrase not correctly repeated; try again.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, use the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy!  (Need 186 more bytes)
.....+++++
+++++
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, use the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy!  (Need 80 more bytes)
....+++++

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy!  (Need 83 more bytes)
...+++++
gpg: key 8AE670A6 marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   2  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: next trustdb check due at 2016-09-26
pub   2048R/8AE670A6 2015-09-28 [expires: 2016-09-27]
      Key fingerprint = 82D9 0644 B265 8E75 1E01  538B B479 3CF4 8AE6 70A6
uid                  Byte Commander <[email protected]>
sub   2048R/0E2F4FD8 2015-09-28 [expires: 2016-09-27]

Notez comment GnuPG nous dit qu'il a besoin de plus d'entropie. J'aurais bien aimé l'hippocampe aussi. Mais là encore, il semble que GnuPG se comporte comme Oliver Twist. : P

Publier votre clé

Nous devons maintenant obtenir notre clé publique afin que les gens puissent vérifier que les choses sont utilisées.

Interface graphique

Retournez à la liste des clés PGP dans l'application seahorse(voir la dernière capture d'écran). Sélectionnez la ou les clés à exporter et, dans le menu Distant , choisissez les clés de synchronisation et de publication :

enter image description here

Le Sync Le bouton sera désactivé si vous n'avez pas sélectionné de serveur sur lequel publier. Faites-le en cliquant sur le bouton Key Servers bouton:

enter image description here

J'ai choisi le serveur d'Ubuntu.

Maintenant, vous pouvez cliquer sur le Sync et le faire publier sur serveur de clés d’Ubunt (désolé pour le spam, Ubuntu!).

CLI

Avec la CLI, vous avez besoin de l'ID de clé que vous souhaitez publier. C'est la toute dernière ligne de la sortie lors de la création de la clé (8AE670A6). Si vous ne vous en souvenez plus, lancez simplement gpg --list-keys. De publier:

$ gpg  --keyserver pgp.mit.edu --send-keys 8AE670A6
gpg: sending key 8AE670A6 to hkp server pgp.mit.edu

Désolé, MIT .

La signature

Je ne connais pas encore de méthode d’interface graphique pratique pour signer un document.

Une fois que vous avez créé le fichier que vous souhaitez signer, dirigez-vous vers le terminal. Essayez gpg --list-keys:

$ gpg --list-keys       
/home/muru/.gnupg/pubring.gpg
---------------------------
pub   2048R/F7878B0C 2015-09-28 [expires: 2016-09-26]
uid                  Byte Commander <[email protected]>
sub   2048R/345B9A4F 2015-09-28 [expires: 2016-09-26]

Vous pouvez signer le fichier en utilisant deux méthodes:

Signature avec cryptage

$ gpg --sign --output examples.sig examples.desktop 

You need a passphrase to unlock the secret key for
user: "Byte Commander <[email protected]>"
2048-bit RSA key, ID F7878B0C, created 2015-09-28

gpg: Invalid passphrase; please try again ...

You need a passphrase to unlock the secret key for
user: "Byte Commander <[email protected]>"
2048-bit RSA key, ID F7878B0C, created 2015-09-28

Si vous êtes sur une session de bureau, il est probable que vous serez accueilli par un mot de passe graphique Invite. Par exemple, dans GNOME:

enter image description here

Si le destinataire possède votre clé publique, il peut la vérifier ou obtenir le contenu déchiffré:

$ gpg --verify examples.sig
gpg: Signature made Monday 28 September 2015 03:25:00 PM IST using RSA key ID F7878B0C
gpg: Good signature from "Byte Commander <[email protected]>"
$ gpg --decrypt examples.sig
[Desktop Entry]
Version=1.0
Type=Link
Name=Examples
Name[aa]=Ceelallo
...
URL=file:///usr/share/example-content/
Icon=folder
X-Ubuntu-Gettext-Domain=example-content

gpg: Signature made Monday 28 September 2015 03:25:00 PM IST using RSA key ID F7878B0C
gpg: Good signature from "Byte Commander <[email protected]>"

Signature en texte clair

Vous ne souhaitez peut-être pas chiffrer le contenu, par exemple, lors de l'envoi d'un courrier. Dans ce cas, utilisez l'option --clearsign:

$ gpg --clearsign examples.desktop 

You need a passphrase to unlock the secret key for
user: "Byte Commander <[email protected]>"
2048-bit RSA key, ID F7878B0C, created 2015-09-28

$ cat examples.desktop.asc 
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

[Desktop Entry]
Version=1.0
Type=Link
Name=Examples
Name[aa]=Ceelallo
...
URL=file:///usr/share/example-content/
Icon=folder
X-Ubuntu-Gettext-Domain=example-content

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQEcBAEBAgAGBQJWCRAaAAoJEGUZkqX3h4sMBWsH/1yw+G0v5Ck+T3PBS90SkvC8
5C0FJeGVr0AgYQohhsE3zEGQ7nn53N7JsvNlF6VccvN99DZIp18JbrJ+qs5hWjtg
KU/ACleR5dvVrJgfjppkuC8Q3cAudvqciKlLjA7Xycr3P49oCNCy8k/ue2TrgCvS
mMb5IS/kqpO7wrOMBAR0c/2CjQsA91S1/YK7DbuUqeNgEzW1grsI7XZPhiDGpAib
D20HWrbdLhklAEJuo1EvuOIggW6MF6ksxDoVapsUzQalD0TWEq6OnvzIS5qhITrc
XaDPQJpiHyCyINnL5aZCUwr2uon7osJ+2a8Ahp1REpzIZTdND9jA5NWSel5+yAs=
=ZrtB
-----END PGP SIGNATURE-----

Signature, avec un fichier séparé pour signature (signature détachée)

Enfin, pour certains fichiers, vous ne pouvez pas avoir la signature dans le document. Par exemple, les fichiers de packaging ou les métadonnées d'un référentiel ont tous deux un contenu d'une nature spécifique qui n'autorise pas facilement les signatures incorporées. Dans ce cas, vous utilisez l'option --detached-sig:

$ gpg --output examples.desktop.sig --detach-sign examples.desktop

You need a passphrase to unlock the secret key for
user: "Byte Commander <[email protected]>"
2048-bit RSA key, ID F7878B0C, created 2015-09-28

$ gpg --verify examples.desktop.sig examples.desktop
gpg: Signature made Monday 28 September 2015 03:35:55 PM IST using RSA key ID F7878B0C
gpg: Good signature from "Byte Commander <[email protected]>"

Remarque

Dans le chiffrement + la signature et dans les signatures détachées, la sortie de gpgest binaire. Vous pouvez obtenir que GnuPG produise des données codées en base64 à l’aide de l’option --armor (armé en ASCII).

Automatisation

Pour signer un script, vous pouvez:

  • utilisez une phrase secrète vide pour la clé
  • en fonction de votre version de GnuPG, envoyez la phrase secrète via stdinname__. Voir cet article Unix & Linux pour certaines options.
18
muru
  1. Créer une clé asymétrique avec gpg

    gpg --gen-key
    
  2. Utilisez gpg pour signer votre fichier (votre clé privée est utilisée)

    gpg --output foo.sig --detach-sig foo.py
    
  3. Testez le fichier de signature (votre clé publique est utilisée)

    gpg --verify foo.sig foo.py
    

    Exemple de sortie

    % gpg --verify foo.sig foo.py 
    gpg: Signature made Mo 28 Sep 2015 12:46:04 CEST using RSA key ID 89B30DEC
    gpg: Good signature from "Your Name <[email protected]>"
    
    % echo "bad" >> foo.py
    
    % gpg --verify foo.sig foo.py
    gpg: Signature made Mo 28 Sep 2015 12:46:04 CEST using RSA key ID 89B30DEC
    gpg: BAD signature from "Your Name <[email protected]>"
    
4
A.B.