Конспект по 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
gpg