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

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 è stato modificato.

Il software è solo un progetto di hobby open source, quindi non voglio spendere soldi per l’acquisto di un certificato ufficiale. Invece, presumo che il programma principale sia sempre valido e affidabile senza ulteriori verifiche. Se qualcuno lo scarica da qualsiasi altra posizione rispetto al mio repository GitHub, è colpa loro.

Da ciò che ho letto, la firma viene solitamente eseguita creando una coppia di chiavi asimmetriche, calcolando un forte valore hash crittografico (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 di hash del file di codice e quindi confrontarla con quella decifrata. Se corrispondono, il plug-in può essere considerato affidabile.

Quindi ora la mia domanda:

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

Gran parte di questa risposta è stata estratta dall’Ar Arch Wiki e dalla documentazione di GnuPG . Qualsiasi raccomandazione in questa risposta è puramente la mia opinione, e dovrebbe essere presa con una tonnellata di sale.

Creazione di una chiave PGP

GUI

  1. Apri l’app Passwords and Keys (aka seahorse ) e fai clic su + (o vai su File -> New , o premi Ctrl N ) per vedere:

    nuova finestra di dialogo per Seahorse

  2. Seleziona la chiave PGP e inserisci i tuoi dettagli. Sto impersonando il Byte Commander:

    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 firma) dal menu a discesa, ma non è necessario: è ansible gestirlo utilizzando le sottochiavi . Puoi lasciare un commento. È anche utile mantenere una data di scadenza sulla chiave. Fai clic su Crea .

  3. Immettere una password sufficientemente lunga (e intendo molto a lungo , il mio esempio è breve, IMO) e fare clic su OK :

    finestra di immissione della password

    Seahorse non sembra avere alcun feedback, a differenza della CLI. Aspetta un po ‘, fai quello che vuoi, mentre raccoglie entropia e crea una chiave. Potrebbe volerci un po ‘. Dopo di che, vedrai che digitano la sezione Chiavi PGP :

    elenco delle chiavi pgp

CLI

Per generare una chiave dalla riga di comando, esegui semplicemente gpg --gen-key . Ti chiederà 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  = key expires in n days w = key expires in n weeks m = key expires in n months 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) " Real name: Byte Commander E-mail address: [email protected] Comment: You selected this USER-ID: "Byte Commander " 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  sub 2048R/0E2F4FD8 2015-09-28 [expires: 2016-09-27] 

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

Pubblicare la tua chiave

Ora, abbiamo bisogno di ottenere la nostra chiave pubblica, quindi le persone possono verificare le cose che lo utilizzano.

GUI

Torna alla lista delle chiavi PGP nell’app seahorse (guarda l’ultima schermata). Seleziona le chiavi che vuoi esportare e nel menu Remoto seleziona Sincronizza e Pubblica chiavi :

inserisci la descrizione dell'immagine qui

Il pulsante Sync sarà disabilitato se non hai selezionato un server su cui pubblicare. Farlo, facendo clic sul pulsante Server delle chiavi :

inserisci la descrizione dell'immagine qui

Ho scelto il server di Ubuntu.

Ora puoi fare clic sul pulsante Sincronizza e farlo pubblicare sul server delle chiavi di Ubuntu (mi dispiace per lo spam, Ubuntu!).

CLI

Con la CLI, è necessario l’ID della chiave che si desidera pubblicare. È l’ultima riga dell’output durante la creazione della chiave ( 8AE670A6 ). Se non ricordi cosa sia, esegui semplicemente 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.

Una volta 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  sub 2048R/345B9A4F 2015-09-28 [expires: 2016-09-26] 

È ansible firmare il file utilizzando 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 " 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 " 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 la descrizione dell'immagine qui

Se il destinatario ha la tua chiave pubblica, può verificarlo 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 " $ 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 " 

Firma con testo in chiaro

Potresti non voler crittografare i contenuti, ad esempio, quando invii una mail. In tal caso, utilizzare l’opzione --clearsign :

 $ gpg --clearsign examples.desktop You need a passphrase to unlock the secret key for user: "Byte Commander " 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 firma (firma separata)

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

 $ gpg --output examples.desktop.sig --detach-sign examples.desktop You need a passphrase to unlock the secret key for user: "Byte Commander " 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 " 

Nota

In crittografia + firma e in firme separate, l’output di gpg è binario. È ansible avere GnuPG con output di codifica base64 utilizzando l’opzione --armor (blindata ASCII).

Automazione

Per firmare la firma, è ansible:

  • 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.
  1. Crea una chiave asimmetrica con gpg

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

     gpg --output foo.sig --detach-sig foo.py 
  3. Testare il file della firma (viene utilizzata la 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 " % 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 "