GPG - memverifikasi tanda tangan tanpa membuat rantai kepercayaan?

19

Apakah mungkin untuk meminta gpg (atau gpg4win) hanya memverifikasi apakah file ditandatangani oleh file kunci publik tertentu, tanpa harus mengimpor dan menandatangani dan percaya kunci itu?

yaitu sesuatu seperti

gpg --using-key pubkey.txt --verify message.txt

sebagai lawan harus membuat kunci pribadi Anda sendiri dan kemudian lakukan

gpg --import pubkey.txt 
gpg --lsign-key [name within pubkey.txt]
# ... something to do with choosing trust levels
gpg --verify message.txt
OJW
sumber
1
Cobalah untuk melihat apakah perintah gpg --status-fd 1 --verify (thefile)memberikan dalam outputnya sebagai string pertama sidik jari kunci yang membuat tanda tangan.
harrymc
Beberapa konteks di sini: kami memiliki sistem yang menandatangani sesuatu. Kami memberikan kunci publiknya kepada orang-orang yang mungkin menerima pesan dari sistem ini, sehingga mereka dapat memeriksa bahwa pesan tidak dirusak. Namun kami tidak ingin memberi tahu penerima untuk "mempercayai apa pun yang ditandatangani oleh kunci ini" karena itu dapat digunakan untuk mengotentikasi pesan dari sistem lain (mis. Email dari teman mereka).
OJW
Jadi kami ingin memberi seseorang file perintah / batch yang memeriksa "apakah gpg mengatakan pesan ini dikirim oleh kunci ini?" tanpa mengganggu penggunaan gpg sehari-hari mereka untuk berkomunikasi dengan orang lain. Kunci hanya dapat dipercaya karena perintah-baris memintanya, bukan karena GPG telah diberitahu untuk selalu mempercayainya.
OJW

Jawaban:

14

Anda harus memiliki kunci publik untuk memverifikasi tanda tangan yang dibuat dengan kunci pribadi yang sesuai, tetapi Anda tidak harus menandatangani atau bahkan menandatangani kunci secara lokal. Dalam hal ini Anda akan menerima peringatan dari GPG bahwa kunci tidak dipercaya.

Inilah tes yang saya buat dengan file yang ditandatangani oleh kunci saya sendiri, tetapi pada sistem di mana kunci tersebut belum diimpor:

[ben@seditious tmp]$ gpg -v --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: Can't check signature: public key not found
[ben@seditious tmp]$ gpg -v --status-fd 1 --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
[GNUPG:] ERRSIG 7FF2D37135C7553C 1 10 00 1380142299 9
[GNUPG:] NO_PUBKEY 7FF2D37135C7553C
gpg: Can't check signature: public key not found
[ben@seditious tmp]$ 

Sayangnya saran Harry tidak berfungsi, itu mengekstrak sedikit informasi lebih banyak, tetapi tidak cukup untuk digunakan.

Seperti yang Anda lihat, sebagian besar informasi yang diperoleh adalah ID kunci subkunci yang digunakan untuk membuat tanda tangan dan waktu tanda tangan dibuat. Ini cocok dengan data yang tersedia untuk pgpdump (atau --list-paket):

bash-3.2$ pgpdump thing.txt.gpg 
Old: Compressed Data Packet(tag 8)
    Comp alg - ZLIB <RFC1950>(comp 2)
Old: One-Pass Signature Packet(tag 4)(13 bytes)
    New version(3)
    Sig type - Signature of a binary document(0x00).
    Hash alg - SHA512(hash 10)
    Pub alg - RSA Encrypt or Sign(pub 1)
    Key ID - 0x7FF2D37135C7553C
    Next packet - other than one pass signature
Old: Literal Data Packet(tag 11)(24 bytes)
    Format - binary
    Filename - thing.txt
    File modified time - Thu Sep 26 06:51:39 EST 2013
    Literal - ...
Old: Signature Packet(tag 2)(412 bytes)
    Ver 4 - new
    Sig type - Signature of a binary document(0x00).
    Pub alg - RSA Encrypt or Sign(pub 1)
    Hash alg - SHA512(hash 10)
    Hashed Sub: signature creation time(sub 2)(4 bytes)
        Time - Thu Sep 26 06:51:39 EST 2013
    Sub: issuer key ID(sub 16)(8 bytes)
        Key ID - 0x7FF2D37135C7553C
    Hash left 2 bytes - f0 97 
    RSA m^d mod n(3066 bits) - ...
        -> PKCS-1
bash-3.2$ 

Seperti yang Anda lihat, ia menyediakan algoritma hash, detail dari jenis kunci (kunci penandatanganan saya adalah subkunci RSA 3072-bit dan ID kunci subkunci, tetapi tidak ada yang mengidentifikasi kunci utama. Informasi itu hanya terungkap ketika Anda memiliki kunci publik dan memverifikasi tanda tangan.

Kemudian saya mengimpor kunci publik saya ke sistem itu dan mencoba lagi:

[ben@seditious tmp]$ gpg -v --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: using PGP trust model
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: DB47 24E6 FA42 86C9 2B4E  55C4 321E 4E23 7359 0E5D
     Subkey fingerprint: B7F0 FE75 9387 430D D0C5  8BDB 7FF2 D371 35C7 553C
gpg: binary signature, digest algorithm SHA512
[ben@seditious tmp]$ 

Sekarang ia dapat mengidentifikasi kunci dan mencocokkannya dengan kunci utama. Namun, adalah mungkin untuk mengurangi sifat dari peringatan tersebut seperti ini:

[ben@seditious tmp]$ gpg -v --verify --trust-model always thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg: WARNING: Using untrusted key!
gpg: binary signature, digest algorithm SHA512
[ben@seditious tmp]$ 

Masih ada peringatan bahwa itu adalah kunci yang tidak dipercaya, tetapi tidak secara besar-besaran dan menghapus verbositas hanya mengurangi ini menjadi ini:

[ben@seditious tmp]$ gpg --verify --trust-model always thing.txt.gpg 
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg: WARNING: Using untrusted key!
[ben@seditious tmp]$ 

Kunci publik diperlukan untuk tahap verifikasi karena digunakan untuk mencocokkan data yang dihasilkan oleh penanda tangan dengan kunci pribadi mereka. Dapat dianggap, secara sederhana, sebagai pelengkap enkripsi di mana kunci pribadi diperlukan untuk mendekripsi data yang dienkripsi ke kunci publik.

Catatan: Saya telah sedikit mengubah UID dalam contoh ini, tetapi setiap orang yang mendapatkan kunci itu akan melihat apa sebenarnya mereka. Kalau tidak, hasilnya adalah copy dan paste langsung.

EDIT: Anda dapat memanggil file kunci publik secara langsung seperti keyring jika Anda memilikinya dalam format lapis baja non-ASCII (yaitu file .gpg alih-alih file .asc). Meski begitu, Anda masih membutuhkan kunci publik. Untuk melakukan ini perintahnya seperti ini:

[ben@seditious ~]$ gpg -v --no-default-keyring --keyring /tmp/mykey.gpg --verify /tmp/thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: using PGP trust model
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: DB47 24E6 FA42 86C9 2B4E  55C4 321E 4E23 7359 0E5D
     Subkey fingerprint: B7F0 FE75 9387 430D D0C5  8BDB 7FF2 D371 35C7 553C
gpg: binary signature, digest algorithm SHA512
[ben@seditious ~]$ 
Ben
sumber
Melihat hasil Anda, saya telah mencapai kesimpulan yang berlawanan. Saya telah menggunakan hasil Anda dalam jawaban saya, tetapi telah memberi Anda kredit untuk itu.
harrymc
Bagian yang Anda rujuk merupakan bentuk panjang dari ID kunci subkunci (secara teknis ID kunci lengkap adalah sidik jari) adalah satu-satunya bagian yang dapat diidentifikasi. Tanpa memiliki kunci publik, Anda tidak dapat mengidentifikasi kunci master atau memverifikasi tanda tangan. Rinciannya ada di bagian 5.2 dari RFC 4880 (dengan sedikit di bagian 2.2, tetapi 5.2 adalah di mana hal-hal yang berguna). Jika saya salah, buktikan verifikasi tanpa salinan kunci (petunjuk: Anda tidak dapat melakukannya dengan contoh saya).
Ben
Juga, pada kesimpulan Anda tentang --verify, itu hanya berfungsi ketika kunci tersedia, jika tidak kembali ke contoh pertama dalam jawaban saya di mana ID kunci dan waktu tanda tangan diverifikasi, tetapi kunci tidak ditemukan.
Ben
Ya, identifikasi lengkap tentu saja tidak mungkin hanya dari ID kunci. Saya telah memodifikasi jawaban saya untuk menyatakan dengan jelas bahwa ini hanya heuristik. Kesimpulan Anda adalah bahwa apa yang diminta poster itu tidak mungkin, tetapi itu mungkin karena poster itu menggunakan kata "verifikasi" yang terlalu kuat.
harrymc
1
Itu benar, OP mungkin tidak menggunakan istilah benar dan saya mungkin telah agak tidak yakin mereka di beberapa tempat juga (saya bersin sebuah banyak tadi malam). Jika pertanyaannya hanya tentang memvalidasi sig tanpa mengimpor kunci, maka contoh dalam edit saya menunjukkan bagaimana hal itu dapat dilakukan, tetapi hanya jika kunci itu dalam format OpenPGP (pubkey.gpg). Tidak berfungsi jika kunci yang diekspor dalam format ASCII lapis baja (pubkey.asc).
Ben
2

Jika Anda setuju dengan pengiriman keyring, daripada file kunci publik, Anda mungkin ingin menggunakan gpgvdaripada gpg:

gpgv --keyring key.ring somefile.txt
Womble
sumber
0

Jika kata Anda "verifikasi" dalam pertanyaan berarti "benar-benar memverifikasi", maka tentu saja kunci publik harus diimpor untuk sepenuhnya memverifikasi dokumen yang ditandatangani. Namun, jika ini berarti "mengidentifikasi", maka saya jelaskan di bawah heuristik yang dapat memberi tahu apakah semua dokumen ditandatangani oleh tanda tangan yang sama.

Menurut tes yang dilakukan oleh @Ben untuk memverifikasi komentar saya, ada kemungkinan bahwa perintah berikut dapat digunakan untuk secara heuristik menunjukkan kunci penandatanganan:

gpg --status-fd 1 --verify thefile.gpg

Tes Ben memberikan hasil di bawah ini. Yang perlu diperhatikan adalah nilai ERRSIG dan NO_PUBKEY, dan juga nilai "ID kunci RSA" yang sebagian terkandung di dalamnya, sebagai berikut:

[ben@seditious tmp]$ gpg -v --status-fd 1 --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
[GNUPG:] ERRSIG 7FF2D37135C7553C 1 10 00 1380142299 9
[GNUPG:] NO_PUBKEY 7FF2D37135C7553C
gpg: Can't check signature: public key not found

Catatan di atas string 7FF2D37135C7553C. String yang sama ini ditemukan di dalam sidik jari kunci yang dilaporkan setelah kunci diimpor:

[ben@seditious ~]$ gpg -v --no-default-keyring --keyring /tmp/mykey.gpg --verify /tmp/thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: using PGP trust model
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: DB47 24E6 FA42 86C9 2B4E  55C4 321E 4E23 7359 0E5D
     Subkey fingerprint: B7F0 FE75 9387 430D D0C5  8BDB 7FF2 D371 35C7 553C
gpg: binary signature, digest algorithm SHA512

String ini ditemukan sebagai bagian bawah sidik jari (Subkey di atas), jadi mungkin dapat digunakan untuk mengidentifikasi kunci. "Sidik jari kunci utama" mungkin harus diverifikasi juga, selain Subkunci.

String "RSA key ID" identik di kedua output dan juga ditemukan sebagai bagian terakhir dari sidik jari, sehingga mungkin saja cukup untuk mengidentifikasi tanda tangan. Jika itu masalahnya, hanya menggunakan output gpg --verifymungkin cukup untuk mengidentifikasi tanda tangan dengan cara yang lebih sederhana.

[ben@seditious tmp]$ gpg -v --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: Can't check signature: public key not found

Pengetahuan saya tentang GPG tidak cukup untuk sepenuhnya memvalidasi metode ini, jadi Anda harus mencobanya pada file contoh lainnya. Jika berhasil, Anda bisa mengurutkan file sesuai dengan tanda tangan mereka, tetapi akan perlu mengimpor kunci untuk menemukan identitas orang yang ditandatanganinya.

Untuk menyatakan kembali dengan jelas: Metode ini tidak dapat sepenuhnya mengidentifikasi tanda tangan. Ini hanya cara memilah dokumen yang ditandatangani secara heuristik.

harrymc
sumber
Tanda tangan mengandung cukup data untuk mengidentifikasi kunci yang digunakan untuk membuatnya dan bersama dengan server kunci dapat digunakan untuk menemukan kunci master (dengan asumsi subkunci penandatanganan digunakan seperti dalam contoh saya). Tanpa salinan kunci publik dalam format OpenPGP (baik dalam keyring atau seperti dalam contoh terakhir saya), validasi tanda tangan tidak dimungkinkan karena sidik jari / kunci ID tidak cukup data untuk menghitungnya.
Ben
@ Ben: Saya ulangi bahwa ini hanya heuristik, yang merupakan yang terbaik yang dapat dilakukan dalam menjawab pertanyaan poster "verifikasi apakah file ditandatangani oleh file kunci publik tertentu, tanpa harus mengimpor dan menandatangani dan percaya kunci itu ".
harrymc
apakah itu akan membuat pertanyaan lebih jelas jika saya mengatakan bahwa kami mempercayai kunci apa pun dalam file .pub (untuk keperluan memeriksa file data spesifik ini), dan bahwa alasan mengapa kami memilih untuk mempercayai file .pub ini berada di luar ruang lingkup ada kegiatan GPG?
OJW
Apakah heuristik dari daftar kunci dalam file .pub dan membandingkan ID kunci RSA mereka bermanfaat? Saya tidak punya gpg di sini untuk mencoba, tetapi mungkin sesuatu seperti "gpg --tidak-default-keyring --keyring <pub-file> --list-keys".
harrymc