Конспект по GnuPG

Файли конфігурації

~/.gnupg - стандартна домашня папка, яка задається змінною оточення GNUPGHOME або опцією --homedir;

~/.gnupg/gpg.conf - конфігураційний файл GPG, який зчитується при запуску. Необхідно резервувати цей файл;

~/.gnupg/pubring.gpg - зв’язка публічних ключів (public keyring). Необхідно резервувати цей файл;

~/.gnupg/pubring.gpg.lock - файл блокування для зв’язки публічних ключів;

~/.gnupg/pubring.kbx - база даний у якій зберігаються усі ключі. Структуру файлу можна подивитись командою kbxutil ~/.gnupg/pubring.kbx;

~/.gnupg/pubring.kbx.lock - файл блокування pubring.kbx;

~/.gnupg/secring.gpg - зв’язка приватних ключів;

~/.gnupg/secring.gpg.lock - файл блокування для зв’язки приватних ключів;

~/.gnupg/.gpg-v21-migrated - файл переходу на GnuPG 2.1;

~/.gnupg/trustdb.gpg - довірена база даних, цей файл не треба резервувати, але треба резервувати ownertrust (--export-ownertrust);

~/.gnupg/trustdb.gpg.lock - файл блокування довіреної бази даних;

~/.gnupg/random_seed - файл, що використовується для збереження стану внутрішнього пулу випадкових чисел;

~/.gnupg/openpgp-revocs.d/ - директорія де зберігаються попередньо згенеровані сертифікати відкликання ключів. Назва файлу відповідає відбитку ключа для якого створений сертифікат. Доступ до цих файлів дозволяє відкликати ключі. Тому ці файли треба тримати у секреті та резервувати.

Опції конфігурації

Усі опції записуються без префікса “--”:

throw-keyids - не включати інформацію про ключ у зашифроване повідомлення. Опція може бути корисна для анонімазації отримувача повідомлення;

no-emit-version - не вставляти версію GPG у зашифроване повідомлення;

no-comments - прибирати коментарі з зашифрованого повідомлення.

Опції команд

--sign, -s - підписати повідомлення або документ, підпис буде знаходитись окремо;

--detach-sign - створює відокремлений підпис. Створює файл, що містить підпис. Цей файл може бути використаний щоб перевірити що оригінальний файл що шифрувався не був змінений. Перевірка файлу з використанням окремого підпису виконується командою --verify;

--delete-key - видалити публічний ключ;

--delete-secret-key - видлити приватний ключ. Приватний клюі можна видалити тільки після видалення публічного ключа з пари;

--symmetric, -c - симетричне шифрування. Симетрично зашифровує повідомлення чи документ. Для розшифрування використовується опція. Для розшифрування використовується опція --decrypt;

--fingerprint - вивести відбиток ключа;

--armor, -a - створює ASCII вивід, який можна вивісти на екран, відправити у месенджері або електронною поштою;

--encrypt, -e - зашифрувати повідомлення або документ. Зашифровує для отримувача вказаного опцією --recipient. Якщо використовується опція --output, GPG помістить зашифрований документ у вказаний файл;

--recipient, -r - вказати ключ який буде використовуватися для шифрування;

--default-recipient - вказати отримувача за замовченням;

--default-recipient-self -

--no-default-recipient -

--decrypt, -d - розшифрувати повідомлення. Розшифровує повідомлення або файл та поміщає результат у стандартний вивід. Для виводу результату у файл використовується опція --output;

--clear-sign, --clearsign - підписати повідомлення, підпис буде збережений разом з повідомленням;

--local-user, -u - вказувати ключ що буде використовуватись для підпису, схоже на опцію --recipient але не те саме;

--verify - перевірити підпис;

--list-keys, -k - показати список публічних ключів;

--list-secret-keys, -K - показати список приватних ключів;

--export - експортувати публічний ключ у файл;

--import - імпортувати публічний ключ у зв’язку;

--edit-key - редагувати ключ;

--expert - експертний режим.

Для використання у скриптах у GPG є хороше API, що активується наступними опціями:

--with-colons -

--status-fd -

--command-fd -

Публікація ключив

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

Адресу серверу ключів можна додати у gpg.conf у рядку keyserver %URL%.

Відправити публічний ключ %KeyID на сервер:

gpg --keyserver %URL% --send-keys %KeyID%

Отримати публічний ключ %KeyID з серверу:

gpg --keyserver %URL% --recv-keys %KeyID%

Оновити інформацію про ключі з серверу:

gpg --keyserver %URL% --refresh-keys

Відкликання ключів

Створення сертифікату відкликання:

gpg -a --gen-revoke %KeyID% > %KeyID%.rev

Імпорт сертифікату відкликання до зв’язки ключів що відкличе відповідний ключ %KeyID%:

gpg --import %KeyID%.rev

Після цього залишається опублікувати ключі на сервері.

Приклади

Шифрування

Симетричне (-c) шифрування файлу test.txt паролем:

gpg -c test.txt

Команда створить шифрований файл test.txt.gpg.

Симетричне (-c) шифрування (-e) файлу test.txt приватним ключем та паролем для користувача (-r) “User Name”:

gpg -c -e -r 'User Name' test.txt

Розшифрувати файл можна буде ключем або паролем. Якщо у зв’язці буде присутній приватний ключі - для розшифровки програма запитає пароль від нього, якщо ні - програма запитає пароль яким шифрувався файл.

Асиметричне шифрування файлу test.txt публічним ключем для користувача (-r) “User Name”:

gpg -e -r 'User Name' test.txt

Замість опції “-r” (ім’я адресату) можна використати опцію “-R” (--hidden-recipient), що приховає ім’я адресату. У протилежному випадку ім’я адресату можна буде подивитися не розшифровуючи файл.

gpg -e -R 'User Name' test.txt

За замовчуванням GPG створює шифровані вайли у бінарному форматі. Що значно зменшує розміри файлу у порівнянні з розміром до шифрування. Але зміст такого бінарного файлу неможливо копіювати і переслати без пошкоджень. Для передачи шифрованого файлу у вигляді тексту необхідно створити файл у форматі ASCII (-a):

gpg -e -a -r 'User Name' test.txt

Команда створить шифрований файл test.txt.asc, зміс якого можна переслати повідомленням або листом.

Шифрування повідомлення (%повідомлення%) у форматі ASCII (-a) для користувача “User Name”:

echo '%повідомлення%' | gpg -e -a -r 'User Name'

Результат буде виведений у термінал, після чого його можна буде відправити повідомленням чи листом. Для виводу у файл (%назва_файлу%):

echo '%повідомлення%' | gpg -e -a -r 'User Name' > %назва_файлу%

Розшифрування

Розшифрувати (-d) файл test.txt.gpg та вивести результат у термінал:

gpg -d test.txt.gpg

Розшифрувати (-d) файл test.txt.gpg та вивести результат у файл (-o) test.txt:

gpg -d -o test.txt test.txt.gpg

Або:

gpg -d test.txt.gpg > test.txt

Розшифрувати повідомлення та вивести результат у термінал:

'%текст_повідомлення%' | gpg -d

Розшифрувати текст з файлу test.txt.gpg і вивести результат у термінал:

cat test.txt.gpg | gpg -d

Вивести інформацію про отримувача без розшифрування

Показати інформацію про отримувача файлу не розшифровуючи файл:

gpg --list-only -d test.txt.gpg

У випадку асиметричного шифрування для отримувача User Name з ключем KeyID:

gpg: encrypted with 2048-bit RSA key, ID %KeyID%, created 2020-02-22
      "User Name"

У випадку симетричного шифрування для користувача User Name з ключем KeyID:

gpg: AES encrypted session key
gpg: encrypted with 1 passphrase
gpg: encrypted with 2048-bit RSA key, ID %KeyID%, created 2020-02-22
      "User Name"

Вказати приватний ключ для розшифрування

У зашифрованих GPG файлах та повідомленнях вказана інформація про отримувача (тобто про секретний ключ, яким можна розшифрувати), якщо отримувач прихований, програма буде просто перебирати наявні приватні ключі у спробі розшифрувати що їй вказали. Щоб явно вказати отримувача, ключ якого треба використовувати, застосовується опція --try-secret-key %User Name%. Якщо ж інформація про отримувача підроблена, будь які спроби розшифрування зазнають невдачі. У такому випадку необхідно вказати опцію --try-all-secrets щоб програма GnuPG перебирала усі доступні приватні ключі не звертаючи уваги на ідентифікатор у шифрованому файлі чи повідомленні, як це відбувається коли отримувач не вказаний зовсім опціями --throw-keyids та --hidden-recipient.

Підписати файл

Підписати файл у бінарному форматі

Для підпису файлу використовується опція --sign або -s. Якщо приватних ключей кілька, необхідно явно вказати потрібний опцією --local-user або -u, що змінеть значення ключу за замовчуванням, опції --default-key.

Підписати файл test.txt приватним ключем користувача User Name:

gpg -u 'User Name' -s test.txt

Команда створить новий файл test.txt.gpg у бінарному форматі, що буде містити і старий файл і підпис (підпис інтегрований у файл). Зміст бінарного файлу неможливо прочитати, скопіювати та переслати окремо від самого файлу.

Підписати файл у форматі ASCII

Підписати у форматі ASCII (--clear-sign) файл test.txt приватним ключем користувача User Name:

gpg -u 'User Name' --clear-sign test.txt

Комадна створить новий файл test.txt.asc, що буде містити підпис (PGP SIGNATURE) та зміст старого файлу (підпис інтегрований у файл). Зміст підписаного файлу можна легко скопіювати та переслати окремо від самого файлу.

Відокремити підпис від оригінального файлу

Підписати файл test.txt приватним ключем користувача User Name окремо від оригінального фалу (--detach-sign або -b):

gpg -u 'User Name' -b test.txt

Команда створить новий файл test.txt.sig, що буде містити лише підпис (підпис не інтегрований у файл).

Перевірити підпис

Для перевірки підпису використовується опція --verify або програма gpgv, що заміняє gpg --verify.

Перевірити підпис інтегрований у файл

Перевірити підпис інтегрований у файл test.txt.gpg:

gpg --verify test.txt.gpg

Перевірити підпис не інтегрований у файл

Перевірити підпис файлу test.txt, що не інтегрований у файл і знаходиться у файлі test.txt.sig:

gpg --verify test.txt.sig test.txt

Виокремити оригінальний файл з підписаного файлу GPG

Якщо файл test.txt.gpg був підписаний з інтеграцією підпису, після перевірки підпису необхідно відділити файл від підпису (-d) щоб отримати оригінальний файл (-o) test.txt:

gpg -d -o test.txt test.txt.gpg

Одночасно підписати і зашифрувати файл

Просто поєднуємо вже відомі опції.

Зашифрувати файл test.txt публічним ключом %одержувача% та підписати приватним ключем %відправника%:

gpg -e -u '%відправник%' -r '%одержувач%' test.txt

Зашифрувати симетричним шифруванням (-c) файл test.txt публічним ключом %одержувача% та підписати приватним ключем %відправника%:

gpg -e -c -u '%відправник%' -r '%одержувач%' test.txt

Редагування ключів

Відкрити ключ для редагування:

gpg --edit-key '%KeyID%'

Далі можна ввести необхідну команду, для того щоб подивитись доступні команди ввести help, для збереження змін save, після чого програма спитає пароль приватного ключа.

Змінити пароль ключа

Змінити пароль приватного ключа користувача User Name:

gpg --batch --edit-key 'User Name' passwd

Змінити рівень довіри

Змінити рівень довіри користувчу User Name:

gpg --edit-key 'User Name' trust

Далі потрибно вказати цифру що буде відповідати потрібному рівню довіри:

  • 1 - не знаю;
  • 2 - не довіряю;
  • 3 - обмежено довіряю;
  • 4 - повністю довіряю;
  • 5 - абсолютно довіряю.

Вимкнути ключ

Вимкнути публічний ключ KeyID:

gpg --batch --edit-key %KeyID% disable

Ввімнути ключ

Ввімкнути публічний ключ KeyID:

gpg --batch --edit-key **KeyID** enable

Відкликання ключів

Створити сертифікат відкливання ключа KeyID можна за допомогою опції --gen-revoke.

gpg --gen-revoke %KeyID%

Після чого ключ треба імпортувати у зв’язку та опублікувати не сервері.

Довіра до ключів

Ви можете довіряти ключам свого співрозмовника, але не бути упевненим у том що він належним чином перевіряє ключі своїх співрозмовників, які підписує. Тому можна вказати рівень довіри до кожного ключа у зв’язці:

  • unknown (невідомо)- нічого не відомо про політику підписання ключів власника ключа. Усім ключам у зв’язці крів власного за замовчуванням призначається цей рівень довіри;
  • none (немає) - відомо про недбалість власника цього ключа при підписанні чужих ключів;
  • marginal (граничне) - власника ключа розуміє значення підписання ключів та перевіряє їх достовірність перед тим як підписати;
  • full (повне) - власник ключа дуже розбірливий у підписанні ключів і його підпису на ключі можна вірити як своєму власному.

Рівень довіри до ключа є вашою приватною інформацією, не експортується разом з ключем і зберігається окремо в спеціальній базі.

Для прискоєння певного рівня довіри ключу:


gpg --edit-key %KeyID%

pub  1024D/8B927C8A  created: 1999-07-02 expires: never      trust: q/f
sub  1024g/C19EA233  created: 1999-07-02 expires: never     
(1)  User Name (Executioner) <test@test.com>

Command> trust
pub  1024D/8B927C8A  created: 1999-07-02 expires: never      trust: q/f
sub  1024g/C19EA233  created: 1999-07-02 expires: never     
(1)  User Name (Executioner) <test@test.com>

Please decide how far you trust this user to correctly
verify other users' keys (by looking at passports,
checking fingerprints from different sources...)?

 1 = Don't know
 2 = I do NOT trust
 3 = I trust marginally
 4 = I trust fully
 s = please show me more information
 m = back to the main menu

Your decision? 3
                
pub  1024D/8B927C8A  created: 1999-07-02 expires: never      trust: m/f
sub  1024g/C19EA233  created: 1999-07-02 expires: never     
(1)  User Name (Executioner) <test@test.com>

Command> quit

### Підписати ключі

Щоб підписати ключі інших користувачів:

```bash
gpg --sign-key user-id

Перевірити підписані ключі:

gpg --list-sigs

Інформацією про підписані ключиtrustdb.gpg. Після підписання ключів необхідно скопіювати файл до папки зі зв’язкою ключів для повсякденного використання.

Сертифікація ключів

  • (generic certification)
  • (persona certification)
  • (casual certification)
  • (positive certification)

Помилки

Неможливо ввести пароль після помилки

Під час симетричного шифрування паролі кешуються щоб не потрібно було вводити один пароль багато разів. Але якщо ввести пароль не вірно і він потрапить у кеш, це викличе помилку при спробі розшифрування. Щоб виправити це треба вказати програмі що кеш використовувати не протрібно --no-symkey-cache:

gpg -d --no-symkey-cache test.txt.gpg
15.01.2022
Tags: gpg