Come firmare i file con gli strumenti da riga di comando di Ubuntu e le mie chiavi?


14

Voglio firmare alcuni file di codice Python che ho scritto, perché sono moduli plug-in per uno dei miei progetti. Per distribuirlo, voglio che l'utente possa essere sicuro che un plug-in sia verificato e sicuro (perché scritto da me o da qualcuno di cui mi fido) e non sia stato modificato.

Il software è solo un progetto hobby open source, quindi non voglio spendere soldi per acquistare un certificato ufficiale. Invece, presumo che il programma principale sia sempre valido e di cui ci si possa fidare senza ulteriore verifica. Se qualcuno lo scarica da qualsiasi posizione diversa dal mio repository GitHub, è colpa loro.

Da quello che ho letto, la firma viene solitamente creata creando una coppia di chiavi asimmetriche, calcolando un valore hash crittografico forte (ad esempio SHA-512) dal file di codice, crittografando l'hash utilizzando la mia chiave privata e memorizzando quella firma in un file separato da spedire con il file di codice originale.
Il programma principale dovrà quindi decrittografare la firma utilizzando la chiave pubblica che viene salvata in testo normale nel codice sorgente del programma principale, calcolare la stessa funzione hash del file di codice e quindi confrontarla con quella decifrata. Se corrispondono, il plug-in può essere considerato attendibile.

Quindi ora la mia domanda:

Come posso creare facilmente una coppia di chiavi asimmetrica forte con gli strumenti Ubuntu e come posso facilmente calcolare un valore hash crittografico di un file?
Automatizzare il processo di firma in uno script (usando sempre la stessa chiave) sarebbe fantastico.

Risposte:


19

Gran parte di questa risposta viene strappata da Arch Wiki e dalla documentazione di GnuPG . Qualsiasi consiglio in questa risposta è puramente la mia opinione e dovrebbe essere preso con una tonnellata di sale.

Creazione di una chiave PGP

GUI

  1. Apri l' app Password e chiavi (aka seahorse) e fai clic su +(o vai su File -> Nuovo o premi CtrlN) per vedere:

    finestra di dialogo nuovo elemento per Cavalluccio marino

  2. Seleziona la chiave PGP e inserisci i tuoi dati. Sto impersonando il comandante di byte:

    finestra di dialogo dei dettagli chiave

    RSA e 2048 bit vanno bene per la maggior parte degli scopi. Se si desidera utilizzarlo solo per la firma, selezionare l' opzione RSA (solo segno) dal menu a discesa, ma non è necessario: questo può essere gestito utilizzando le sottochiavi . Puoi lasciare un commento. È anche utile mantenere una data di scadenza sulla chiave. Fare clic Create.

  3. Inserisci una password sufficientemente lunga (e intendo lunga , il mio esempio è breve, IMO) e fai clic Ok:

    finestra di dialogo per l'immissione della password

    Seahorse non sembra avere alcun feedback, a differenza della CLI. Aspetta un po ', facendo tutto quello che vuoi fare, mentre raccoglie entropia e crea una chiave. Potrebbe volerci un po '. Dopodiché, vedrai le chiavi nella sezione Chiavi PGP :

    elenco di chiavi pgp

CLI

Per generare una chiave dalla riga di comando, basta eseguire gpg --gen-key. Ti verrà chiesto gli stessi dettagli della GUI:

$ 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) <heinrichh@duesseldorf.de>"

Real name: Byte Commander
E-mail address: byte@command.er
Comment: 
You selected this USER-ID:
    "Byte Commander <byte@command.er>"

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 <byte@command.er>
sub   2048R/0E2F4FD8 2015-09-28 [expires: 2016-09-27]

Nota come GnuPG ci dice che ha bisogno di più entropia. Vorrei anche cavalluccio marino. Ma poi di nuovo, sembra che GnuPG si comporti come Oliver Twist. : P

Pubblicare la tua chiave

Ora, dobbiamo portare la nostra chiave pubblica là fuori, in modo che le persone possano verificare le cose utilizzandola.

GUI

Torna all'elenco delle chiavi PGP seahorsenell'app (vedi l'ultimo screenshot). Seleziona le chiavi che desideri esportare e, nel menu Remoto , seleziona Sincronizza e pubblica chiavi :

inserisci qui la descrizione dell'immagine

Il Syncpulsante verrà disabilitato se non hai selezionato un server in cui pubblicare. Fallo, facendo clic sul Key Serverspulsante:

inserisci qui la descrizione dell'immagine

Ho scelto il server Ubuntu.

Ora puoi fare clic sul Syncpulsante e pubblicarlo sul keyserver di Ubuntu (scusami per lo spam, Ubuntu!).

CLI

Con l'interfaccia della riga di comando, è necessario l'ID chiave della chiave che si desidera pubblicare. È l'ultima riga dell'output durante la creazione della chiave ( 8AE670A6). Se non ricordi di cosa si tratta, corri e basta gpg --list-keys. Pubblicare:

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

Mi dispiace, MIT .

firma

Non conosco ancora un metodo GUI conveniente per firmare un documento.

Dopo aver creato il file che vuoi firmare, vai al terminale. Prova gpg --list-keys:

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

Puoi firmare il file usando due metodi:

Firma con crittografia

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

You need a passphrase to unlock the secret key for
user: "Byte Commander <byte@command.er>"
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 <byte@command.er>"
2048-bit RSA key, ID F7878B0C, created 2015-09-28

Se sei su una sessione desktop, è probabile che verrai accolto con una richiesta di password grafica. Ad esempio, in GNOME:

inserisci qui la descrizione dell'immagine

Se il destinatario ha la tua chiave pubblica, può verificarla o ottenere il contenuto decrittografato:

$ 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 <byte@command.er>"
$ 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 <byte@command.er>"

Firma con testo in chiaro

Potresti non voler crittografare il contenuto, ad esempio, quando invii una mail. In tal caso, utilizzare l' --clearsignopzione:

$ gpg --clearsign examples.desktop 

You need a passphrase to unlock the secret key for
user: "Byte Commander <byte@command.er>"
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-----

Firma, con un file separato per la firma (firma staccata)

Infine, per alcuni file, non è possibile avere la firma nel documento. Ad esempio, i file di packaging o i metadati per un repository hanno entrambi un contenuto di natura specifica che non consente facilmente le firme incorporate. In questo caso, si utilizza l' --detached-sigopzione:

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

You need a passphrase to unlock the secret key for
user: "Byte Commander <byte@command.er>"
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 <byte@command.er>"

Nota

Nella crittografia + firma e nelle firme separate, l'output di gpgè binario. Puoi avere GnuPG in uscita dati con codifica base64 usando l' --armoropzione (ASCII-blindato).

Automazione

Per firmare lo script, è possibile:

  • utilizzare una passphrase vuota per la chiave
  • a seconda della versione di GnuPG, inviare la passphrase tramite stdin. Vedi questo post Unix e Linux per alcune opzioni.

Risposta molto bella e dettagliata. Ma riguardo alle chiavi di esempio che hai creato ... Non so se sono troppo contento del fatto che un insieme di chiavi inutilizzate per il mio pseudonimo si stia aggirando. Se voglio creare chiavi reali con quel nome in un secondo momento e usarle, le persone che le cercano potrebbero confondersi. Immagino che le tue chiavi di esempio e le mie chiavi reali saranno in grado di coesistere a causa di indirizzi di posta elettronica diversi e quindi ottenere un ID diverso, ma ancora ... È possibile che tu possa eliminare di nuovo quelle chiavi?
Byte Comandante

@ByteCommander il termine è revocato . Cercherò di revocarli. Del resto, dovrei aggiungere una sezione sulla revoca delle chiavi.
muru,

@ByteCommander mi dispiace, ho eliminato la chiave che ho pubblicato (e non avevo fatto un certificato di revoca (errore classico n00b), quindi non posso revocare quella chiave. Tuttavia, ha una scadenza di un anno, quindi, beh, qualsiasi confusione sarà risolta tra un anno.
muru,

Va bene, succede. Non sono sicuro se dovrei essere infastidito o semplicemente ridere di quello stupido errore ... Penso che per il mio progetto in questione preferirò semplicemente usare il modulo Python rsache consente facilmente di firmare i dati senza lottare con tutte le cose GPG. Ciò potrebbe diventare molto utile una volta che avrò iniziato a pubblicare e confezionare software per davvero, ma probabilmente è semplicemente troppo per il mio scopo in questo momento. Quindi fino ad allora probabilmente sarà scaduto! :)
Comandante di byte

@ByteCommander, suppongo. Anche se ti suggerirei di usare il tuo vero nome durante la creazione della chiave e di lasciare il nick per il campo dei commenti.
muru,

4
  1. Crea una chiave asimmetrica con gpg

    gpg --gen-key
    
  2. Usa gpg per firmare il tuo file (viene utilizzata la tua chiave privata)

    gpg --output foo.sig --detach-sig foo.py
    
  3. Prova il file della firma (viene utilizzata la tua chiave pubblica)

    gpg --verify foo.sig foo.py
    

    Esempio di output

    % 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 <your.name@host.com>"
    
    % 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 <your.name@host.com>"
    
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.