Bagaimana cara menandatangani file dengan alat baris perintah Ubuntu dan kunci saya sendiri?

14

Saya ingin menandatangani beberapa file kode Python yang saya tulis, karena mereka adalah modul plug-in untuk salah satu proyek saya. Untuk mendistribusikannya, saya ingin pengguna dapat memastikan plug-in diverifikasi dan aman (karena ditulis oleh saya atau seseorang yang saya percayai) dan tidak dimodifikasi.

Perangkat lunak ini hanyalah proyek hobi sumber terbuka, oleh karena itu saya tidak ingin mengeluarkan uang untuk membeli sertifikat resmi. Sebagai gantinya, saya menganggap bahwa program utama selalu valid dan dapat dipercaya tanpa verifikasi tambahan. Jika seseorang mengunduhnya dari lokasi lain selain dari repositori GitHub saya, itu salah mereka.

Dari apa yang saya baca, penandatanganan biasanya dilakukan dengan membuat pasangan kunci asimetris, menghitung nilai hash kriptografi yang kuat (misalnya SHA-512) dari file kode, mengenkripsi hash menggunakan kunci pribadi saya dan menyimpan tanda tangan itu di file terpisah untuk dikirim dengan file kode asli.
Program utama kemudian harus mendekripsi tanda tangan menggunakan kunci publik yang disimpan dalam teks biasa dalam kode sumber program utama, menghitung fungsi hash yang sama dari file kode dan kemudian membandingkannya dengan yang didekripsi. Jika cocok, plug-in dapat dipercaya.

Jadi sekarang pertanyaan saya:

Bagaimana cara mudah membuat pasangan kunci asimetris yang kuat dengan alat Ubuntu dan bagaimana cara menghitung nilai hash kriptografis file dengan mudah?
Mengotomatiskan proses penandatanganan dalam skrip (menggunakan selalu kunci yang sama) akan sangat bagus.

Komandan Byte
sumber

Jawaban:

19

Sebagian besar jawaban ini diambil dari Arch Wiki dan dokumentasi GnuPG . Setiap rekomendasi dalam jawaban ini sepenuhnya adalah pendapat saya, dan harus diambil dengan satu ton garam.

Membuat kunci PGP

GUI

  1. Buka aplikasi Kata Sandi dan Kunci (alias seahorse), dan klik +(atau buka File -> Baru , atau tekan CtrlN) untuk melihat:

    dialog item baru untuk Seahorse

  2. Pilih kunci PGP , dan masukkan detail Anda. Saya meniru Byte Commander:

    dialog detail kunci

    RSA dan 2048 bit baik untuk sebagian besar keperluan. Jika Anda hanya ingin menggunakannya untuk penandatanganan, pilih opsi RSA (sign only) dari menu drop-down, tetapi Anda tidak perlu melakukannya - ini dapat ditangani dengan menggunakan subkunci . Anda dapat meninggalkan komentar. Menjaga tanggal kedaluwarsa pada kunci Anda juga berguna. Klik Create.

  3. Masukkan kata sandi panjang yang sesuai (dan maksud saya panjang , contoh saya pendek, IMO), dan klik Ok:

    dialog entri kata sandi

    Kuda laut tampaknya tidak memiliki umpan balik, tidak seperti CLI. Tunggu sebentar, lakukan apa pun yang ingin Anda lakukan, sambil mengumpulkan entropi dan membuat kunci. Mungkin butuh beberapa saat. Setelah itu, Anda akan melihat kunci mereka di bagian Kunci PGP :

    daftar kunci pgp

CLI

Untuk menghasilkan kunci dari baris perintah, jalankan saja gpg --gen-key. Ini akan meminta Anda untuk rincian yang sama seperti yang dilakukan 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) <[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]

Perhatikan bagaimana GnuPG memberi tahu kami bahwa dibutuhkan lebih banyak entropi. Berharap kuda laut juga. Tapi sekali lagi, rasanya seperti GnuPG bertindak seperti Oliver Twist. : P

Menerbitkan kunci Anda

Sekarang, kita perlu mendapatkan kunci publik di luar sana, sehingga orang dapat memverifikasi hal-hal yang menggunakannya.

GUI

Kembali ke daftar kunci PGP di seahorseaplikasi (lihat tangkapan layar terakhir). Pilih tombol yang ingin Anda ekspor, dan di menu Remote , pilih Kunci Sinkron dan Publikasikan :

masukkan deskripsi gambar di sini

The SyncTombol akan dinonaktifkan jika Anda belum memilih server untuk mempublikasikan ke. Lakukan dengan mengklik Key Serverstombol:

masukkan deskripsi gambar di sini

Saya memilih server Ubuntu.

Sekarang, Anda dapat mengklik Synctombol dan menerbitkannya ke server kunci Ubuntu (maaf untuk spam, Ubuntu!).

CLI

Dengan CLI, Anda memerlukan ID kunci dari kunci yang ingin Anda terbitkan. Ini adalah baris terakhir dari output saat membuat kunci ( 8AE670A6). Jika Anda tidak ingat apa itu, jalankan saja gpg --list-keys. Untuk menerbitkan:

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

Maaf, MIT .

Menandatangani

Saya belum tahu metode GUI yang nyaman dalam menandatangani dokumen.

Setelah Anda membuat file yang ingin Anda tandatangani, pergilah ke terminal. Coba 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]

Anda dapat menandatangani file menggunakan dua metode:

Masuk dengan enkripsi

$ 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

Jika Anda berada di sesi desktop, kemungkinan Anda akan disambut dengan prompt kata sandi grafis. Misalnya, dalam GNOME:

masukkan deskripsi gambar di sini

Jika penerima memiliki kunci publik Anda, mereka dapat memverifikasinya, atau mendapatkan konten yang didekripsi:

$ 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]>"

Masuk dengan cleartext

Anda mungkin tidak ingin mengenkripsi konten, misalnya, ketika mengirim surat. Dalam hal ini, gunakan --clearsignopsi:

$ 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-----

Penandatanganan, dengan file terpisah untuk tanda tangan (tanda tangan terpisah)

Terakhir, untuk beberapa file, Anda tidak dapat memiliki tanda tangan di dokumen. Misalnya, mengemas file, atau metadata untuk repositori, keduanya memiliki konten yang bersifat khusus yang tidak mudah memungkinkan tanda tangan tertanam. Dalam hal ini, Anda menggunakan --detached-sigopsi:

$ 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]>"

Catatan

Dalam enkripsi + penandatanganan dan dalam tanda tangan terpisah, output dari gpgadalah biner. Anda dapat memiliki data yang disandikan GnuPG keluaran base64 menggunakan --armoropsi (ASCII-lapis baja).

Otomatisasi

Untuk penandatanganan skrip, Anda dapat:

  • gunakan frasa sandi kosong untuk kunci
  • tergantung pada versi GnuPG Anda, kirim frasa sandi melalui stdin. Lihat posting Unix & Linux ini untuk beberapa opsi.
muru
sumber
Jawaban yang sangat bagus dan terperinci. Tetapi tentang contoh kunci yang Anda buat ... Saya tidak tahu apakah saya terlalu senang dengan fakta bahwa seperangkat kunci yang tidak digunakan untuk nama samaran saya ada. Jika saya ingin membuat kunci nyata dengan nama itu nanti dan menggunakannya, orang-orang yang mencarinya mungkin bingung. Saya kira kunci contoh Anda dan kunci asli saya akan dapat hidup berdampingan karena alamat email yang berbeda dan karenanya mendapatkan ID yang berbeda, tetapi tetap saja ... Apakah mungkin Anda dapat menghapus kunci itu lagi?
Byte Commander
@ByteCommander, istilah ini dicabut . Saya akan melihat mencabut mereka. Untuk itu, saya harus menambahkan bagian tentang mencabut kunci.
muru
@ByteCommander maaf, saya menghapus kunci yang saya terbitkan (dan tidak membuat sertifikat pencabutan (kesalahan n00b klasik), jadi saya tidak dapat mencabut kunci itu. Namun, memiliki masa berlaku satu tahun, jadi, well, kebingungan apa pun akan teratasi dalam setahun
muru
Oke, yah - itu terjadi. Tidak yakin apakah saya harus jengkel atau hanya menertawakan kesalahan bodoh itu ... Saya pikir untuk proyek saya yang dimaksud saya lebih suka menggunakan modul Python rsayang dengan mudah memungkinkan penandatanganan data tanpa kesulitan dengan semua hal GPG. Itu mungkin menjadi sangat berguna begitu saya mulai menerbitkan dan mengemas perangkat lunak secara nyata, tetapi mungkin terlalu banyak untuk tujuan saya saat ini. Jadi sampai saat itu mungkin akan kedaluwarsa! :)
Byte Commander
@ByteCommander keduanya, saya kira. Meskipun saya sarankan Anda menggunakan nama asli Anda saat membuat kunci Anda, dan tinggalkan nick untuk kolom komentar.
muru
4
  1. Buat kunci asimetris dengan gpg

    gpg --gen-key
    
  2. Gunakan gpg untuk menandatangani file Anda (kunci pribadi Anda digunakan)

    gpg --output foo.sig --detach-sig foo.py
    
  3. Uji file tanda tangan (kunci publik Anda digunakan)

    gpg --verify foo.sig foo.py
    

    Contoh 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 <[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]>"
    
AB
sumber