Ubuntu komut satırı araçları ve kendi anahtarlarım ile nasıl dosya imzalanır?


14

Yazdığım bazı Python kod dosyalarını imzalamak istiyorum, çünkü bunlar projelerimden biri için eklenti modülleri. Dağıtmak için, kullanıcının bir eklentinin doğrulanmış ve güvenli olduğundan emin olmasını istiyorum (çünkü benim tarafımdan ya da güvendiğim biri tarafından yazıldı) ve değiştirilmedi.

Yazılım sadece açık kaynaklı bir hobi projesi, bu yüzden resmi bir sertifika almak için para harcamak istemiyorum. Bunun yerine, ana programın her zaman geçerli olduğunu ve ek doğrulama olmadan güvenilir olabileceğini varsayıyorum. Birisi GitHub depomdan başka bir konumdan indirirse, bu onların hatasıdır.

Okuduğum kadarıyla, imzalama genellikle asimetrik bir anahtar çifti oluşturarak, kod dosyasından güçlü bir şifreleme karma değeri (örneğin SHA-512) hesaplayarak, özel anahtarımı kullanarak karma şifreleyerek ve bu imzayı ayrı bir dosyada saklayarak yapılır orijinal kod dosyası ile gönderilir.
Daha sonra ana program, ana programın kaynak kodunda düz metin olarak kaydedilen ortak anahtarı kullanarak imzanın şifresini çözmek, kod dosyasının aynı karma işlevini hesaplamak ve daha sonra şifresi çözülmüş olanla karşılaştırmak zorunda kalacaktır. Eşleşirlerse, eklentiye güvenilebilir.

Şimdi sorum:

Ubuntu araçlarıyla nasıl kolayca güçlü bir asimetrik anahtar çifti oluşturabilirim ve bir dosyanın şifreleme karma değerini kolayca nasıl hesaplayabilirim?
Bir komut dosyasında imzalama işlemini otomatikleştirmek (her zaman aynı anahtarı kullanarak) harika olurdu.

Yanıtlar:


19

Bu cevabın çoğu Arch Wiki ve GnuPG belgelerinden koparıldı . Bu cevaptaki herhangi bir tavsiye tamamen benim görüşümdür ve bir ton tuzla alınmalıdır.

PGP anahtarı oluşturma

GUI

  1. Şifreler ve Tuşlar uygulaması (aka seahorse) ve tıklayın +(ya gidin Dosya -> Yeni veya basın CtrlN) görmek için:

    Seahorse için yeni öğe iletişim kutusu

  2. PGP anahtarını seçin ve bilgilerinizi girin. Bayt Komutanı'nın kimliğine bürünüyorum:

    önemli ayrıntılar iletişim kutusu

    RSA ve 2048 bitleri çoğu amaç için uygundur. Yalnızca imzalamak için kullanmak istiyorsanız , açılır menüden RSA (yalnızca işaret) seçeneğini seçin, ancak yapmanız gerekmez - bu, alt anahtarlar kullanılarak ele alınabilir . Yorum bırakabilirsiniz. Anahtarınızda bir son kullanma tarihi tutmak da yararlıdır. Tıklayın Create.

  3. Uygun şekilde uzun bir şifre girin (yani uzun , örneğim kısa, IMO) ve tıklayın Ok:

    şifre giriş iletişim kutusu

    Seahorse, CLI'den farklı olarak geri bildirimde bulunmuyor gibi görünüyor. Entropi toplar ve bir anahtar yaratırken, ne yapmak isterseniz yapın, bir süre bekleyin. Biraz zaman alabilir. Bundan sonra, PGP Anahtarları bölümünde tuşlandıklarını göreceksiniz :

    pgp anahtarlarının listesi

CLI

Komut satırından bir anahtar oluşturmak için çalıştırın gpg --gen-key. Sizden GUI ile aynı ayrıntıları soracaktır:

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

GnuPG'nin bize daha fazla entropiye ihtiyaç duyduğunu nasıl söylediğine dikkat edin. Keşke denizatı da yaptı. Ama sonra tekrar, GnuPG, Oliver Twist gibi davranıyor gibi geliyor. : P

Anahtarınızı yayınlama

Şimdi, ortak anahtarımızı oraya çıkarmalıyız, böylece insanlar bunu kullanarak bir şeyleri doğrulayabilir.

GUI

seahorseUygulamadaki PGP anahtarları listesine geri dönün (son ekran görüntüsüne bakın). Dışa aktarmak istediğiniz anahtarları seçin ve Uzak menüsünde Senkronizasyon ve Yayınlama Anahtarları'nı seçin :

resim açıklamasını buraya girin

SyncEğer yayınlamak için bir sunucu seçmediyseniz düğmesi devre olacaktır. Key ServersDüğmeye tıklayarak bunu yapın :

resim açıklamasını buraya girin

Ubuntu'nun sunucusunu seçtim.

Şimdi, Syncdüğmeyi tıklayıp Ubuntu'nun anahtar sunucusunda yayınlamasını sağlayabilirsiniz (spam için üzgünüm, Ubuntu!).

CLI

CLI ile, yayınlamak istediğiniz anahtarın anahtar kimliğine ihtiyacınız vardır. ( 8AE670A6) Anahtarını oluştururken çıktının en son satırıdır . Ne olduğunu hatırlamıyorsanız, koşun gpg --list-keys. Yayımlamak:

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

Üzgünüm, MIT .

İmzalama

Henüz bir belgeyi imzalamak için uygun bir GUI yöntemi bilmiyorum.

İmzalamak istediğiniz dosyayı oluşturduktan sonra terminale gidin. Deneyin 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]

Dosyayı iki yöntem kullanarak imzalayabilirsiniz:

Şifreleme ile imzalama

$ 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

Bir masaüstü oturumundaysanız, grafik parola istemiyle karşılaşma olasılığınız yüksektir. Örneğin, GNOME'da:

resim açıklamasını buraya girin

Alıcının genel anahtarınız varsa, doğrulayabilir veya şifresi çözülen içeriği alabilir:

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

Açık metinle imzalama

Örneğin bir posta gönderirken içerikleri şifrelemek istemeyebilirsiniz. Bu durumda, --clearsignseçeneği kullanın:

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

İmza için ayrı bir dosya ile imzalama (bağımsız imza)

Son olarak, bazı dosyalar için belgede imzaya sahip olamazsınız. Örneğin, paketleme dosyaları veya bir havuzun meta verileri, her ikisi de katıştırılmış imzalara kolayca izin vermeyen belirli bir nitelikteki içeriğe sahiptir. Bu durumda, --detached-sigseçeneği kullanırsınız :

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

Not

Şifreleme + imzalamada ve bağımsız imzalarda çıktısı gpgikiliktir. GnuPG çıkış base64 kodlu verilere --armor(ASCII zırhlı) sahip olabilirsiniz.

Otomasyon

İmzalama komut dosyası oluşturmak için şunları yapabilirsiniz:

  • anahtar için boş bir parola kullanın
  • GnuPG sürümünüze bağlı olarak, parolayı yoluyla gönderin stdin. Bkz bu Unix & Linux yazı bazı seçenekleri için.

Çok güzel ve ayrıntılı cevap. Ama yarattığınız örnek anahtarlar hakkında ... Takma adım için kullanılmayan anahtarlar kümesinin yerleştirilmiş olmasından çok mutlu olup olmadığımı bilmiyorum. Daha sonra bu adla gerçek anahtarlar oluşturmak ve bunları kullanmak istersem, onları arayan insanlar kafanız karışabilir. Örnek anahtarlarınızı tahmin ediyorum ve gerçek anahtarlarım farklı e-posta adresleri nedeniyle bir arada var olacak ve bu nedenle farklı bir kimlik alacak, ancak yine de ... Bu anahtarları tekrar silmeniz mümkün mü?
Byte Komutanı

@ByteCommander terimi iptal edilir . Onları iptal etmeye bakacağım. Bu nedenle, anahtarları iptal etme hakkında bir bölüm eklemeliyim.
muru

@ByteCommander üzgünüm, yayınladığım anahtarı sildim (ve iptal sertifikası (klasik n00b hatası) yapmadım, bu yüzden bu anahtarı iptal edemiyorum. Ancak, bir yıllık bir süreye sahip, yani, herhangi bir karışıklık bir yıl içinde çözülecek
muru

Tamam, bu olur. Rahatsız olmam ya da sadece bu aptal hata hakkında gülmem gerekip gerekmediğinden emin değilim ... Söz konusu projem için, sadece rsatüm GPG şeyleriyle uğraşmadan verileri imzalamaya kolayca izin veren Python modülünü kullanmayı tercih ederim . Yazılımı gerçekten yayınlamaya ve paketlemeye başladığımda çok yararlı olabilir, ancak şu anda amacım için çok fazla. O zamana kadar muhtemelen süresi dolacak! :)
Byte Komutanı

Her ikisi de @ByteCommander, sanırım. Anahtarınızı oluştururken gerçek adınızı kullanmanızı ve yorum alanı için takma ad bırakmanızı öneririm.
muru

4
  1. Gpg ile asimetrik bir anahtar oluşturun

    gpg --gen-key
    
  2. Dosyanızı imzalamak için gpg kullanın (özel anahtarınız kullanılır)

    gpg --output foo.sig --detach-sig foo.py
    
  3. İmza dosyasını test edin (genel anahtarınız kullanılır)

    gpg --verify foo.sig foo.py
    

    Örnek çıktı

    % 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>"
    
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.