Bagaimana cara menampilkan detail kunci gpg tanpa mengimpornya?


131

Saya memiliki salinan kunci gpg repositori postgresql apt dan ingin melihat detail kunci gpg seperti yang ada dalam file. Apakah ini mungkin tanpa mengimpornya ke gantungan kunci?

Jawaban:


149

Ada beberapa level detail yang bisa Anda dapatkan ketika melihat data kunci OpenPGP: ringkasan dasar, output ringkasan ini yang dapat dibaca mesin atau daftar detail dari paket OpenPGP.

Informasi Kunci Dasar

Untuk puncak singkat pada file kunci OpenPGP, Anda dapat dengan mudah melewatkan nama file sebagai parameter atau pipa dalam data kunci melalui STDIN. Jika tidak ada perintah yang dilewati, GnuPG mencoba menebak apa yang ingin Anda lakukan - dan untuk data kunci, ini mencetak ringkasan pada kunci:

$ gpg a4ff2279.asc
gpg: WARNING: no command supplied.  Trying to guess what you mean ...
pub   rsa8192 2012-12-25 [SC]
      0D69E11F12BDBA077B3726AB4E1F799AA4FF2279
uid           Jens Erat (born 1988-01-19 in Stuttgart, Germany)
uid           Jens Erat <jens.erat@fsfe.org>
uid           Jens Erat <jens.erat@uni-konstanz.de>
uid           Jens Erat <jabber@jenserat.de>
uid           Jens Erat <email@jenserat.de>
uid           [jpeg image of size 12899]
sub   rsa4096 2012-12-26 [E] [revoked: 2014-03-26]
sub   rsa4096 2012-12-26 [S] [revoked: 2014-03-26]
sub   rsa2048 2013-01-23 [S] [expires: 2023-01-21]
sub   rsa2048 2013-01-23 [E] [expires: 2023-01-21]
sub   rsa4096 2014-03-26 [S] [expires: 2020-09-03]
sub   rsa4096 2014-03-26 [E] [expires: 2020-09-03]
sub   rsa4096 2014-11-22 [A] [revoked: 2016-03-01]
sub   rsa4096 2016-02-24 [A] [expires: 2020-02-23]

Dengan menetapkan --keyid-format 0xlong, ID kunci panjang dicetak dan bukan ID kunci pendek tidak aman :

$ gpg a4ff2279.asc                                                                 
gpg: WARNING: no command supplied.  Trying to guess what you mean ...
pub   rsa8192/0x4E1F799AA4FF2279 2012-12-25 [SC]
      0D69E11F12BDBA077B3726AB4E1F799AA4FF2279
uid                             Jens Erat (born 1988-01-19 in Stuttgart, Germany)
uid                             Jens Erat <jens.erat@fsfe.org>
uid                             Jens Erat <jens.erat@uni-konstanz.de>
uid                             Jens Erat <jabber@jenserat.de>
uid                             Jens Erat <email@jenserat.de>
uid                             [jpeg image of size 12899]
sub   rsa4096/0x0F3ED8E6759A536E 2012-12-26 [E] [revoked: 2014-03-26]
sub   rsa4096/0x2D6761A7CC85941A 2012-12-26 [S] [revoked: 2014-03-26]
sub   rsa2048/0x9FF7E53ACB4BD3EE 2013-01-23 [S] [expires: 2023-01-21]
sub   rsa2048/0x5C88F5D83E2554DF 2013-01-23 [E] [expires: 2023-01-21]
sub   rsa4096/0x8E78E44DFB1B55E9 2014-03-26 [S] [expires: 2020-09-03]
sub   rsa4096/0xCC73B287A4388025 2014-03-26 [E] [expires: 2020-09-03]
sub   rsa4096/0x382D23D4C9773A5C 2014-11-22 [A] [revoked: 2016-03-01]
sub   rsa4096/0xFF37A70EDCBB4926 2016-02-24 [A] [expires: 2020-02-23]
pub   rsa1024/0x7F60B22EA4FF2279 2014-06-16 [SCEA] [revoked: 2016-08-16]

Memberikan -vatau -vvbahkan akan menambah informasi. Saya lebih suka mencetak detail paket dalam hal ini (lihat di bawah).

Output yang Dapat Dibaca Mesin

GnuPG juga memiliki format keluaran yang dipisahkan oleh titik dua, yang mudah dipecah dan memiliki format yang stabil. The Format didokumentasikan dalam GnuPG doc/DETAILSberkas . Opsi untuk menerima format ini adalah --with-colons.

$ gpg --with-colons a4ff2279.asc
gpg: WARNING: no command supplied.  Trying to guess what you mean ...
pub:-:8192:1:4E1F799AA4FF2279:1356475387:::-:
uid:::::::::Jens Erat (born 1988-01-19 in Stuttgart, Germany):
uid:::::::::Jens Erat <jens.erat@fsfe.org>:
uid:::::::::Jens Erat <jens.erat@uni-konstanz.de>:
uid:::::::::Jens Erat <jabber@jenserat.de>:
uid:::::::::Jens Erat <email@jenserat.de>:
uat:::::::::1 12921:
sub:-:4096:1:0F3ED8E6759A536E:1356517233:1482747633:::
sub:-:4096:1:2D6761A7CC85941A:1356517456:1482747856:::
sub:-:2048:1:9FF7E53ACB4BD3EE:1358985314:1674345314:::
sub:-:2048:1:5C88F5D83E2554DF:1358985467:1674345467:::
sub:-:4096:1:8E78E44DFB1B55E9:1395870592:1599164118:::
sub:-:4096:1:CC73B287A4388025:1395870720:1599164118:::
sub:-:4096:1:382D23D4C9773A5C:1416680427:1479752427:::
sub:-:4096:1:FF37A70EDCBB4926:1456322829:1582466829:::

Sejak GnuPG 2.1.23, gpg: WARNING: no command supplied. Trying to guess what you mean ...peringatan dapat dihilangkan dengan menggunakan --import-options show-onlyopsi bersama dengan --importperintah (ini juga berfungsi tanpa --with-colons, tentu saja):

$ gpg --with-colons --import-options show-only --import a4ff2279
[snip]

Untuk versi yang lebih lama: pesan peringatan dicetak pada STDERR, jadi Anda bisa membaca STDIN untuk memisahkan informasi utama dari peringatan.

Detail Teknis: Mendaftar Paket OpenPGP

Tanpa menginstal paket lebih lanjut, Anda dapat menggunakan gpg --list-packets [file]untuk melihat informasi tentang paket OpenPGP yang terkandung dalam file.

$ gpg --list-packets a4ff2279.asc
:public key packet:
    version 4, algo 1, created 1356475387, expires 0
    pkey[0]: [8192 bits]
    pkey[1]: [17 bits]
    keyid: 4E1F799AA4FF2279
:user ID packet: "Jens Erat (born 1988-01-19 in Stuttgart, Germany)"
:signature packet: algo 1, keyid 4E1F799AA4FF2279
    version 4, created 1356516623, md5len 0, sigclass 0x13
    digest algo 2, begin of digest 18 46
    hashed subpkt 27 len 1 (key flags: 03)
[snip]

The pgpdump [file]alat bekerja sama dengan gpg --list-packetsdan memberikan output yang sama, tetapi menyelesaikan semua pengidentifikasi algoritma untuk representasi dibaca. Ini tersedia untuk semua distribusi yang relevan (pada turunan Debian, paket ini disebut pgpdumpseperti alat itu sendiri).

$ pgpdump a4ff2279.asc
Old: Public Key Packet(tag 6)(1037 bytes)
    Ver 4 - new
    Public key creation time - Tue Dec 25 23:43:07 CET 2012
    Pub alg - RSA Encrypt or Sign(pub 1)
    RSA n(8192 bits) - ...
    RSA e(17 bits) - ...
Old: User ID Packet(tag 13)(49 bytes)
    User ID - Jens Erat (born 1988-01-19 in Stuttgart, Germany)
Old: Signature Packet(tag 2)(1083 bytes)
    Ver 4 - new
    Sig type - Positive certification of a User ID and Public Key packet(0x13).
    Pub alg - RSA Encrypt or Sign(pub 1)
    Hash alg - SHA1(hash 2)
    Hashed Sub: key flags(sub 27)(1 bytes)
[snip]

1
Terima kasih. Saya hanya menggunakan "gpg --list-keys path-to-key-file" dan mendapatkan apa yang ingin saya lihat: ... hashed subpkt 2 len 4 (sig dibuat 2013-02-24) hashed subpkt 9 len 4 (key berakhir setelah 4y134d23h24m) ... dan pgpdump membuat output sedikit lebih mudah dibaca.
Amos Shapira

@AmosShapira Anda yakin? Perintah itu sama sekali tidak bekerja untuk saya. Mungkin maksud Anda --list-packets?
Jonathan Cross

1
@ JonathanCross Memang, output yang dijelaskan terdengar seperti --list-packets.
Jens Erat

1
Bagaimana cara menyingkirkan jelek ini WARNING: no command suppliedke stderr? (Ini menggagalkan penggunaan gpgdalam skrip dengan benar. Ketika sampai pada crypto, satu-satunya cara aman adalah memperlakukan output apa pun pada stderr sebagai kesalahan fatal. Hanya dengan cara ini Anda akan siap ketika kelemahan penting baru ditemukan yang hanya mencetak ke stderr).
Tino

1
Saya tidak sadar ada jalan yang mudah. Anda masih dapat menggunakan file kunci sebagai keyring dan kemudian menjalankan --list-keys, sesuatu seperti gpg --no-default-keyring --keyring=/tmp/<keyfile> --list-keys. Atau cukup buang pesan peringatan, ada banyak opsi untuk memfilter stderr dalam skrip (ba) sh .
Jens Erat

31

Saya sepertinya bisa bergaul dengan sederhana:

$gpg <path_to_file>

Output mana yang seperti ini:

$ gpg /tmp/keys/something.asc 
  pub  1024D/560C6C26 2014-11-26 Something <something@none.org>
  sub  2048g/0C1ACCA6 2014-11-26

Op tidak menentukan secara spesifik info kunci apa yang relevan. Output ini yang saya pedulikan.


30

Untuk memverifikasi dan mendaftar sidik jari kunci (tanpa mengimpornya ke keyring terlebih dahulu), ketikkan

gpg --with-fingerprint <filename>

Sunting: di Ubuntu 18.04 (gpg 2.2.4) sidik jari tidak ditampilkan dengan perintah di atas. Gunakan --with-subkey-fingerprintopsi sebagai gantinya

gpg --with-subkey-fingerprint <filename>

4
Ini harus menjadi jawaban yang diterima imo. Saya setuju dengan komentar-diposting-sebagai-jawaban oleh @Skyr.
gertvdijk

2
ACK, ini sangat bagus, tidak memerlukan kunci pribadi lokal, dll. Tidak menampilkan nama kunci ... berfungsi dengan baik.
Florian Heigl

1
Untuk beberapa alasan yang tidak diketahui / tidak berdokumen gpg --with-fingerprintmenekan pencetakan sidik jari di samping saya. Ubuntu 18.04gpg (GnuPG) 2.1.18
Tino

Hal yang sama juga terjadi pada saya juga @Tino, apakah Anda menemukan info tambahan tentang alasannya?
kjones

@Tino dan @kjones Memperbarui jawabannya dengan --with-subkey-fingerprintinfo yang dapat digunakan di Ubuntu 18.04
Ronny Andersson

9

Opsi --list-packetsmem-parsing data pgp dari file dan menampilkan strukturnya - dengan cara yang sangat teknis. Saat mem-parsing kunci publik, Anda dapat dengan mudah mengekstrak id pengguna dan id kunci tanda tangan.

Berhati-hatilah karena perintah ini hanya mem-parsing format data, tidak ada validasi tanda tangan atau hal serupa.


2

Ketika saya menemukan jawaban ini, saya mencari cara untuk mendapatkan output yang mudah diurai. Bagi saya opsi --with-colonsmelakukan trik:

$ gpg --with-colons file
sec::4096:1:AAAAAAAAAAAAAAAA:YYYY-MM-DD::::Name (comment) email
ssb::4096:1:BBBBBBBBBBBBBBBB:YYYY-MM-DD::::

Dokumentasi dapat ditemukan di sini .


Bagaimana Anda mendapatkan output YYYY-MM-DD yang bagus? Saya tidak dapat mereproduksi itu dengan gpg2.x dan --with-titik dua.
MKesper

1

Anda juga dapat menggunakan --keyid-formatsakelar untuk menampilkan ID kunci pendek atau panjang:

$ gpg2 -n --with-fingerprint --keyid-format=short --show-keys <filename>

yang keluarannya seperti ini (contoh dari kunci repo PostgreSQL CentOS):

pub   dsa1024/442DF0F8 2008-01-08 [SCA]                                                                       │
      Key fingerprint = 68C9 E2B9 1A37 D136 FE74  D176 1F16 D2E1 442D F0F8                                    │              honor-keyserver-url
uid                    PostgreSQL RPM Building Project <pgsqlrpms-hackers@pgfoundry.org>                      │                     When  using --refresh-keys, if the key in question has a preferred keyserver URL, then use that
sub   elg2048/D43F1AF8 2008-01-08 [E]

0

pgpdump( https://www.lirnberger.com/tools/pgpdump/ ) adalah alat yang dapat Anda gunakan untuk memeriksa blok pgp.

Itu tidak ramah pengguna, dan cukup teknis, bagaimanapun,

  • itu mem-parsing kunci publik atau pribadi (tanpa peringatan)
  • itu tidak mengubah keyring apa pun (kadang-kadang tidak begitu jelas apa yang dilakukan gpg di balik tenda, menurut pengalaman saya)
  • itu mencetak semua paket, khususnya paket userid yang menampilkan berbagai data teks tentang kunci.
pgpdump -p test.asc 
New: Secret Key Packet(tag 5)(920 bytes)
    Ver 4 - new
    Public key creation time - Fri May 24 00:33:48 CEST 2019
    Pub alg - RSA Encrypt or Sign(pub 1)
    RSA n(2048 bits) - ...
    RSA e(17 bits) - ...
    RSA d(2048 bits) - ...
    RSA p(1024 bits) - ...
    RSA q(1024 bits) - ...
    RSA u(1020 bits) - ...
    Checksum - 49 2f 
New: User ID Packet(tag 13)(18 bytes)
    User ID - test (test) <tset>                        
New: Signature Packet(tag 2)(287 bytes)
    Ver 4 - new
    Sig type - Positive certification of a User ID and Public Key packet(0x13).
    Pub alg - RSA Encrypt or Sign(pub 1)
    Hash alg - SHA256(hash 8)
    Hashed Sub: signature creation time(sub 2)(4 bytes)
        Time - Fri May 24 00:33:49 CEST 2019
    Hashed Sub: issuer key ID(sub 16)(8 bytes)
        Key ID - 0x396D5E4A2E92865F
    Hashed Sub: key flags(sub 27)(1 bytes)
        Flag - This key may be used to certify other keys
        Flag - This key may be used to sign data
    Hash left 2 bytes - 74 7a 
    RSA m^d mod n(2048 bits) - ...
        -> PKCS-1

sayangnya tidak membaca stdin: /


Saya pgpdumpmembaca stdin. Misalnya, curl -s https://www.theguardian.com/pgp/PublicKeys/Guardian%20Application-Security.pub.txt | pgpdumpberfungsi dengan baik.
rickhg12hs

0

Untuk mendapatkan ID kunci (8 byte, 16 digit hex), ini adalah perintah yang bekerja untuk saya di GPG 1.4.16, 2.1.18 dan 2.2.19:

gpg --list-packets <key.asc | awk '$1=="keyid:"{print$2}'

Untuk mendapatkan informasi lebih lanjut (selain ID kunci):

gpg --list-packets <key.asc

Untuk mendapatkan lebih banyak informasi:

gpg --list-packets -vvv --debug 0x2 <key.asc

Perintah

gpg --dry-run --import <key.asc

juga berfungsi di ketiga versi, tetapi dalam GPG 1.4.16 hanya mencetak ID kunci pendek (4 byte, 8 digit hex), sehingga kurang aman untuk mengidentifikasi kunci.

Beberapa perintah dalam jawaban lain (misalnya gpg --show-keys, gpg --with-fingerprint, gpg --import --import-options show-only) tidak bekerja di beberapa 3 versi GPG atas, sehingga mereka tidak portabel bila menargetkan beberapa versi GPG.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.