Детальна перевірка ключів GnuPG

Як завжди, важливо перевірити результат. На щастя, є інструмент, який допоможе в цьому. hkt (hopenpgp-tools) забезпечують саме це. Утиліта не встановлюється у системі за замовчуванням, але може бути встановлена безпосередньо з репозиторію Ubuntu / LinuxMint. Здається наразі honpgp-tools недоступний у форматі rpm для RHEL або CentOS.

# Debian / Ubuntu
$ sudo apt-get install hopenpgp-tools
# RedHat / CentOS
# ... not available.

За допомогою hopenpgp-tools можна перевірити ключ для налаштування hopenpgp-tools. У наведеній нижче команді використовується «hkt», який є частиною hopenpgp-tools, щоб витягти публічний ключ із зв’язки ключів. Крім того, утиліта hopenpgp-tools під назвою «hokey» виконує перевірку ключових налаштування. Зелені розділи показують, де реалізується найкраща практика. Якщо налаштування не відповідає найкращій практиці, утиліта позначить його червоним.

$ hkt export-pubkeys --keyring gnupg-test/pubring.gpg 0xD93D03C13478D580 | hokey lint
hokey (hopenpgp-tools) 0.17
Copyright (C) 2012-2015  Clint Adams
hokey comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions.
hkt (hopenpgp-tools) 0.17
Copyright (C) 2012-2015  Clint Adams
hkt comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions.
Key has potential validity: good
Key has fingerprint: F8C8 1342 2A7F 7A3A 9027  E158 D93D 03C1 3478 D580
Checking to see if key is OpenPGPv4: V4
Checking to see if key is RSA or DSA (>= 2048-bit): RSA 4096
Checking user-ID- and user-attribute-related items:
  Alice <alice@example.com>:
    Self-sig hash algorithms: [SHA-512]
    Preferred hash algorithms: [SHA-512, SHA-384, SHA-256, SHA-224]
    Key expiration times: [1y11m29d81000s = Fri Nov 30 21:44:14 UTC 2018]
    Key usage flags: [[certify-keys]]
  Alice <alice@example.org>:
    Self-sig hash algorithms: [SHA-512]
    Preferred hash algorithms: [SHA-512, SHA-384, SHA-256, SHA-224]
    Key expiration times: [1y11m29d81000s = Fri Nov 30 21:44:14 UTC 2018]
    Key usage flags: [[certify-keys]]

Іншим способом перевірки згенерованого ключа GnuPG є pgpdump. Ця утиліта не інтерпретуватиме ключову інформацію та позначатиме будь-яку інформацію, яка вважається неприпустимою, але покаже вам необроблену ключову інформацію. З іншого боку, вона розкриває набагато більше деталей про сам ключ.

Утиліта pgpdump також не встановлена за замовчуванням, але її можна встановити безпосередньо зі сховищ дистрибутиву. На відміну вад утиліти «hopenpgp-tools», pgpdump доступний як rpm для RedHat і CentOS.

# Debian / Ubuntu
$ sudo apt install pgpdump
# RedHat / CentOS
$ yum install pgpdump

Програма pgpdump бере експорт секретного ключа, отриманого з резервної копії, і видає всю його інформацію у зрозумілому людям форматі. Наведена нижче команда показує згруповану інформацію для головного ключа та підключів. Перший блок містить інформацію про секретний головний ключ. Виділена область в першому блоці показує налаштування s2k, визначені в gpg.conf.

$ gpg --homedir ./gnupg-test --export-secret-keys --armor 0xD93D03C13478D580 | pgpdump 
Old: Secret Key Packet(tag 5)(1862 bytes)
   Ver 4 - new
   Public key creation time - Wed Nov 30 22:44:14 CET 2016
   Pub alg - RSA Encrypt or Sign(pub 1)
   RSA n(4096 bits) - ...
   RSA e(17 bits) - ...
   Sym alg - AES with 256-bit key(sym 9)
   Iterated and salted string-to-key(s2k 3):
      Hash alg - SHA512(hash 10)
      Salt - 12 43 4f 59 74 01 a2 ff 
      Count - 1015808(coded count 159)
   IV - 2f d5 54 c1 1f f0 a6 87 a3 af 58 ef 69 47 ec 4f 
   Encrypted RSA d
   Encrypted RSA p
   Encrypted RSA q
   Encrypted RSA u
   Encrypted SHA1 hash

Наведене вище показує, що цей ключ - це RSA 4096. Перший блок показує ідентифікатор та сигнатуру ключа. Це ясно показує ідентичність підпису головного ключа. У підпису Hash алгоритм SHA512, а також переважають алгоритми, як визначено в pgp.conf, і можна знайти сам ключа.

Old: User ID Packet(tag 13)(25 bytes)
   User ID - Alice <alice@example.com>
Old: Signature Packet(tag 2)(573 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 - SHA512(hash 10)
   Hashed Sub: signature creation time(sub 2)(4 bytes)
      Time - Wed Nov 30 22:44:14 CET 2016
   Hashed Sub: key flags(sub 27)(1 bytes)
      Flag - This key may be used to certify other keys
   Hashed Sub: key expiration time(sub 9)(4 bytes)
      Time - Fri Nov 30 22:44:14 CET 2018
   Hashed Sub: preferred symmetric algorithms(sub 11)(4 bytes)
      Sym alg - AES with 256-bit key(sym 9)
      Sym alg - AES with 192-bit key(sym 8)
      Sym alg - AES with 128-bit key(sym 7)
      Sym alg - CAST5(sym 3)
   Hashed Sub: preferred hash algorithms(sub 21)(4 bytes)
      Hash alg - SHA512(hash 10)
      Hash alg - SHA384(hash 9)
      Hash alg - SHA256(hash 8)
      Hash alg - SHA224(hash 11)
   Hashed Sub: preferred compression algorithms(sub 22)(4 bytes)
      Comp alg - ZLIB <RFC1950>(comp 2)
      Comp alg - BZip2(comp 3)
      Comp alg - ZIP <RFC1951>(comp 1)
      Comp alg - Uncompressed(comp 0)
   Hashed Sub: features(sub 30)(1 bytes)
      Flag - Modification detection (packets 18 and 19)
   Hashed Sub: key server preferences(sub 23)(1 bytes)
      Flag - No-modify
   Sub: issuer key ID(sub 16)(8 bytes)
      Key ID - 0xD93D03C13478D580
   Hash left 2 bytes - b4 17 
   RSA m^d mod n(4096 bits) - ...
      -> PKCS-1
Old: User ID Packet(tag 13)(25 bytes)
   User ID - Alice <alice@example.org>
Old: Signature Packet(tag 2)(573 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 - SHA512(hash 10)
   Hashed Sub: signature creation time(sub 2)(4 bytes)
      Time - Wed Nov 30 22:44:28 CET 2016
   Hashed Sub: key flags(sub 27)(1 bytes)
      Flag - This key may be used to certify other keys
   Hashed Sub: key expiration time(sub 9)(4 bytes)
      Time - Fri Nov 30 22:44:14 CET 2018
   Hashed Sub: preferred symmetric algorithms(sub 11)(4 bytes)
      Sym alg - AES with 256-bit key(sym 9)
      Sym alg - AES with 192-bit key(sym 8)
      Sym alg - AES with 128-bit key(sym 7)
      Sym alg - CAST5(sym 3)
   Hashed Sub: preferred hash algorithms(sub 21)(4 bytes)
      Hash alg - SHA512(hash 10)
      Hash alg - SHA384(hash 9)
      Hash alg - SHA256(hash 8)
      Hash alg - SHA224(hash 11)
   Hashed Sub: preferred compression algorithms(sub 22)(4 bytes)
      Comp alg - ZLIB <RFC1950>(comp 2)
      Comp alg - BZip2(comp 3)
      Comp alg - ZIP <RFC1951>(comp 1)
      Comp alg - Uncompressed(comp 0)
   Hashed Sub: features(sub 30)(1 bytes)
      Flag - Modification detection (packets 18 and 19)
   Hashed Sub: key server preferences(sub 23)(1 bytes)
      Flag - No-modify
   Sub: issuer key ID(sub 16)(8 bytes)
      Key ID - 0xD93D03C13478D580
   Hash left 2 bytes - e5 1a 
   RSA m^d mod n(4096 bits) - ...
      -> PKCS-1

Після головного ключа та ідентифікаторів можна знайти секретні ключі. Перший – це ключ підпису розміром 3072 біти. Частина виводу з підписами показує два підписи, один з головного ключа і один підпис від самого себе (самопідпис). Сам підпис можна ідентифікувати за «ідентифікатором ключа емітента».

Old: Secret Subkey Packet(tag 7)(1414 bytes)
   Ver 4 - new
   Public key creation time - Wed Nov 30 22:44:21 CET 2016
   Pub alg - RSA Encrypt or Sign(pub 1)
   RSA n(3072 bits) - ...
   RSA e(17 bits) - ...
   Sym alg - AES with 256-bit key(sym 9)
   Iterated and salted string-to-key(s2k 3):
      Hash alg - SHA512(hash 10)
      Salt - 0f 7d 79 55 7c 4e 99 71 
      Count - 1015808(coded count 159)
   IV - f6 1f ba 7c d4 40 28 19 72 c5 12 0f 4f c1 a3 65 
   Encrypted RSA d
   Encrypted RSA p
   Encrypted RSA q
   Encrypted RSA u
   Encrypted SHA1 hash
Old: Signature Packet(tag 2)(964 bytes)
   Ver 4 - new
   Sig type - Subkey Binding Signature(0x18).
   Pub alg - RSA Encrypt or Sign(pub 1)
   Hash alg - SHA512(hash 10)
   Hashed Sub: signature creation time(sub 2)(4 bytes)
      Time - Wed Nov 30 22:44:21 CET 2016
   Hashed Sub: key flags(sub 27)(1 bytes)
      Flag - This key may be used to sign data
   Hashed Sub: key expiration time(sub 9)(4 bytes)
      Time - Fri Nov 30 22:44:21 CET 2018
   Sub: issuer key ID(sub 16)(8 bytes)
      Key ID - 0xD93D03C13478D580
   Sub: embedded signature(sub 32)(412 bytes)
   Ver 4 - new
   Sig type - Primary Key Binding Signature(0x19).
   Pub alg - RSA Encrypt or Sign(pub 1)
   Hash alg - SHA512(hash 10)
   Hashed Sub: signature creation time(sub 2)(4 bytes)
      Time - Wed Nov 30 22:44:21 CET 2016
   Sub: issuer key ID(sub 16)(8 bytes)
      Key ID - 0x1ED73636975EC6DE
   Hash left 2 bytes - 2c da 
   RSA m^d mod n(3071 bits) - ...
      -> PKCS-1
   Hash left 2 bytes - c0 7e 
   RSA m^d mod n(4095 bits) - ...
      -> PKCS-1

Ключ шифрування, а також ключ автентифікації показують лише один підпис головного ключа. Оскільки їхні можливості не включають підписання, вони не підписані самі собою.

Old: Secret Subkey Packet(tag 7)(1414 bytes)
   Ver 4 - new
   Public key creation time - Wed Nov 30 22:44:23 CET 2016
   Pub alg - RSA Encrypt or Sign(pub 1)
   RSA n(3072 bits) - ...
   RSA e(17 bits) - ...
   Sym alg - AES with 256-bit key(sym 9)
   Iterated and salted string-to-key(s2k 3):
      Hash alg - SHA512(hash 10)
      Salt - 5c 54 ae 09 9d d2 01 c6 
      Count - 1015808(coded count 159)
   IV - 6d 44 b1 68 d4 c5 94 41 c0 23 ea 92 bc 50 ce 68 
   Encrypted RSA d
   Encrypted RSA p
   Encrypted RSA q
   Encrypted RSA u
   Encrypted SHA1 hash
Old: Signature Packet(tag 2)(549 bytes)
   Ver 4 - new
   Sig type - Subkey Binding Signature(0x18).
   Pub alg - RSA Encrypt or Sign(pub 1)
   Hash alg - SHA512(hash 10)
   Hashed Sub: signature creation time(sub 2)(4 bytes)
      Time - Wed Nov 30 22:44:23 CET 2016
   Hashed Sub: key flags(sub 27)(1 bytes)
      Flag - This key may be used to encrypt communications
      Flag - This key may be used to encrypt storage
   Hashed Sub: key expiration time(sub 9)(4 bytes)
      Time - Fri Nov 30 22:44:23 CET 2018
   Sub: issuer key ID(sub 16)(8 bytes)
      Key ID - 0xD93D03C13478D580
   Hash left 2 bytes - fb 43 
   RSA m^d mod n(4096 bits) - ...
      -> PKCS-1
Old: Secret Subkey Packet(tag 7)(1414 bytes)
   Ver 4 - new
   Public key creation time - Wed Nov 30 22:44:26 CET 2016
   Pub alg - RSA Encrypt or Sign(pub 1)
   RSA n(3072 bits) - ...
   RSA e(17 bits) - ...
   Sym alg - AES with 256-bit key(sym 9)
   Iterated and salted string-to-key(s2k 3):
      Hash alg - SHA512(hash 10)
      Salt - a5 7a f7 44 d2 b7 3c 2d 
      Count - 1015808(coded count 159)
   IV - 25 3c aa 37 c9 8e 16 eb 12 b6 7d 04 36 a3 db 92 
   Encrypted RSA d
   Encrypted RSA p
   Encrypted RSA q
   Encrypted RSA u
   Encrypted SHA1 hash
Old: Signature Packet(tag 2)(549 bytes)
   Ver 4 - new
   Sig type - Subkey Binding Signature(0x18).
   Pub alg - RSA Encrypt or Sign(pub 1)
   Hash alg - SHA512(hash 10)
   Hashed Sub: signature creation time(sub 2)(4 bytes)
      Time - Wed Nov 30 22:44:26 CET 2016
   Hashed Sub: key flags(sub 27)(1 bytes)
      Flag - This key may be used for authentication
   Hashed Sub: key expiration time(sub 9)(4 bytes)
      Time - Fri Nov 30 22:44:26 CET 2018
   Sub: issuer key ID(sub 16)(8 bytes)
      Key ID - 0xD93D03C13478D580
   Hash left 2 bytes - 9d 8b 
   RSA m^d mod n(4095 bits) - ...
      -> PKCS-1

Навіть якщо використовувати gpgdump не так зручно, як перевіряти ключ за допомогою hopenpgp-tools, є інші деталі, які можуть бути цікавими. Крім того, для RedHat / CentOS та інших дистрибутивах на основі rpm він пропонує хорошу альтернативу honpgp-tools.

Переклад і доповнення статті: “Create GnuPG key with sub-keys to sign, encrypt, authenticate”

08.01.2022
Tags: gpg