# GnuPG (Русский)

GnuPG предоставляет удобные инструменты для шифрования и электронной подписи любых данных. Включает в себя также управление закрытыми и открытыми ключами.

## Установка

gnupg можно установить из официального репозитория с помощью pacman.

## Переменные окружения

### GNUPGHOME

Переменная `$GNUPGHOME` используется для пути к директории, в которой хранятся все конфигурационные файлы и ключи. По умолчанию `$GNUPGHOME` не содержит никаких значений и в таком случае используется переменная `$HOME` для этого. Это значит что все файлы конфигурации будут храниться в `~/.gnupg` после установки. Заменить путь по умолчанию можно добавив строку в один из ваших файлов автозапуска:

    export GNUPGHOME="/path/to/gnupg/directory"

Обратите внимание: По умолчанию права доступа директории gnupg установлены на 700, а содержимое 600. Из чего следует, что только владелец директории имеет право читать и изменять содержимое директории. Это мера безопасности и не стоит это менять.

### GPG_AGENT_INFO

`GPG_AGENT_INFO` содержит путь к pgp-agent. Состоит из 3-х колонок:

1. путь к Unix Domain Socket
2. идентификатор процесса pgp-agent (PID)
3. версия протокола

Например: `GPG_AGENT_INFO=/tmp/gpg-eFqmSC/S.gpg-agent:7795:1`.

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

По умолчанию, настройки конфигурации находятся в файле `~/.gnupg/gpg.conf`. Если вы хотите поменять путь, запускайте gpg так `$ gpg --homedir path/to/file`, либо используйте переменную `$GNUPGHOME`, как описано выше.

В этот файл можно добавить необходимые вам параметры. Вписывайте только название параметра, без двух дефисов. Начать можно взяв шаблонный файл `usr/share/gnupg/gpg-conf.skel`. Ниже представлен базовый конфигурационный файл:

    ~/.gnupg/gpg.conf

    default-key name            # полезно если вы планируете управлять несколькими ключами и хотите указать какой использовать по умолчанию
    keyring file                # добавит file в текущий keyring-список
    trustdb-name file           # использовать file вместо стандартного trustdb
    homedir dir                 # изменить название gnupg директории на dir вместо ~/.gnupg
    display-charset utf-8       # предполагать что система использует кодировку UTF-8 не смотря ни на что
    keyserver name              # использовать name как сервер ключей
    no-greeting                 # не показывать текст приветствия во время запуска
    armor                       # обеспечить ASCII вывод. По умолчанию используется двоичный OpenPGP формат

Если вы хотите использовать определённые параметры на многопользовательской сиситеме, параметры необходимо вписывать в `/etc/skel/.gnupg/`. Таким образом можно создать конфигурацию для нового пользователя командой:

    # addgnupghome user1 user2

которая создаст копии этих конфигурационных файлов в директории `/home/userX/.gnupg/`.

## Основное управление ключами

Обратите внимание: В параметр `<user-id>` любой команды можно вписать идентификатор ключа, отпечаток, часть имени или адрес электронной почты. GnuPG в этом плане гибок.

### Создание ключа

- Для начала, выберите наиболее криптостойкие алгоритмы:

    ~/.gnupg/gpg.conf

    personal-digest-preferences SHA512
    cert-digest-algo SHA512
    default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed

- Сгенерируйте личный ключ введя:

    $ gpg --gen-key

Вам понадобится ответить на несколько вопросов. Обычно, большинству пользователей понадобятся ключи RSA для подписи и шифрований. Рекомендуется использовать размер ключа в 4096 битов (по умолчанию 2048).

Хоть указание даты окончания срока подключа технически не является обязательным, это, тем не менее, считается хорошей практикой. Срока в один год скорее всего будет вполне достаточно для большинства пользователей. В таком случае даже если вы потеряете доступ к своим ключам, это даст другим пользователям знать что ключ больше не используется.

### Управление ключом

- Команда `gpg --edit-key <user-id>` покажет меню с большинством возможностей управления ключами. Ниже приведён пример указания даты окончания срока ключа:

    $ gpg --edit-key <user-id>
    > key number
    > expire yyyy-mm-dd
    > save
    > quit

Некоторые полезные команды:

    > passwd       # изменить пароль
    > clean        # сжать все неиспользуемые идентификаторы (которые были отозванны либо их срок действия истёк)
    > revkey       # отозвать ключ
    > addkey       # добавить подключ к текущему ключу
    > expire       # изменить дату окончания срока ключа

- Сгенерировать ASCII вывод вашего открытого ключа (для распространения):

    $ gpg --armor --output public.key --export <user-id>

- Зарегистрировать ключ в публичном PGP сервере ключей, чтобы другие пользователи могли получить ваш открытый ключ без необходимости напрямую связываться с вами:

    $ gpg  --keyserver pgp.mit.edu --send-keys <user-id>

- Подписать и зашифровать для пользователя Bob:

    $ gpg se -r Bob file

- Сделать "чистую" подпись файла:

    $ gpg --clearsign file

### Rotating subkeys

Важно: Ни в коем случае не удаляйте отозванные или просроченные подключи без особой на то причины, иначе вы полностью потеряете возможность расшифровать файлы, зашифрованные старым подключом. Удаляйте только чужие отозванные/просроченные подключи, если хотите очистить свой список открытых ключей.

Если вы выбрали дату конца срока подключа, желательно уже за несколько недель до конца этого срока создать новый. Таким образом у других пользователей будет позможность вовремя обновить свой список ключей.

- Создать новый подключ (repeat for both signing and encrypting key)

    $ gpg --edit-key <user-id>
    > addkey

И ответьте на несколько вопросов (см. предыдущую секцию для рекомендованных настроек).

- Сохраните изменения

    > save

- Обновите ключ на сервере ключей.

    $ gpg  --keyserver pgp.mit.edu --send-keys <user-id>

Обратите внимание: Отзывать просроченные подключи абсолютно бесполезно и рассматривается многими как плохая практика. Если вы постоянно отзываете ключи, уверенность других пользователей в вас может быть подорвана.

### Импортировать ключ

- Импортировать открытый ключ в ваш список открытых ключей:

    $ gpg --import public.key

- Импортировать закрытый ключ в ваш список закрытых ключей:

    $ gpg --import private.key

### Список ключей

- Список открытых ключей:

    $ gpg --list-keys

- Список закрытых ключей:

    $ gpg --list-secret-keys

## Шифрование

Для шифрования есть возможность использовать несколько закрытых ключей. В этом случае вам необходимо указывать, какой ключ вы хотите использовать для этого. Для этого используйте опцию `-u UID` или `--local-user UID`, иначе будет использован ключ, выбранный по умолчанию.

Чтобы зашифровать файл:

    $ gpg --encrypt secret.tar -o secret.tar.gpg

- Чтобы указать, для кого будет зашифрован файл, воспользуйтесь опцией `-r` или `--recipient`.
- Вы можете использовать gnupg для шифрования важных докуметов, но только один файл за раз. Если вы хотите зашифровать директорию или целую файловую систему, вам стоит взглянуть на TrueCrypt или EncFS. Тем не менее, вы всегда можете заархивировать несколько файлов и затем зашифровать архив.

Чтобы расшифровать файл:

    $ gpg --decrypt secret.tar.gpg

Необходимо будет ввести ваш пароль.

## Демон gpg-agent

`Gpg-agent` часто используется как демон для запросов и кеширования пароля. Это полезно если GnuPG используется внешней программой, такой как клиент электронной почты. Чтобы активировать демон, добавьте следующее в `~/.gnupg/gpg.conf`:

    use-agent

Благодаря этому, GnuPG будет использовать демон каждый раз когда будет необходимость в пароле. Однако, демон должен быть запущен заранее. Для автозапуска, создайте следующий файл и сделайте его исполняемым и не забудьте изменить ваш путь envfile если вы изменяли $GNUPGHOME:

    /etc/profile.d/gpg-agent.sh

    if [ $EUID -ne 0 ] ; then
        envfile="$HOME/.gnupg/gpg-agent.env"
        if [[ -e "$envfile" ]] && kill -0 $(grep GPG_AGENT_INFO "$envfile" | cut -d: -f 2) 2>/dev/null; then
            eval "$(cat "$envfile")"
        else
            eval "$(gpg-agent --daemon --enable-ssh-support --write-env-file "$envfile")"
        fi
        export GPG_AGENT_INFO  # the env file does not contain the export statement
        export SSH_AUTH_SOCK   # включить gpg-agent для ssh
    fi

Если вы не хотите чтобы gpg-agent автоматически запускался для всех пользователей, вы можете просто добавить следующую строчку в ваш `~/.xinitrc`:

    eval $(gpg-agent --daemon) &

Выйдите из текущей X сессии и залогиньтесь снова. Убедитесь, что `gpg-agent` активирован:

    $ pgrep gpg-agent

#### Способ запроса пароля (Pinentry)

И наконец, демону нужно указать каким способом просить у пользователя пароль. Это можно сделать в файле `~/.gnupg/gpg-agent.conf`

По умолчанию используется GTK диалоговое окно. Чтобы использовать ncurses или Qt, добавьте следующее в файл:

    pinentry-program /usr/bin/pinentry-curses

или

    pinentry-program /usr/bin/pinentry-qt4

Больше опций и информации вы найдёте в `man gpg-agent` и `info pinentry`.

## Keysigning Parties

Keysigning Party — мероприятие, целью которого является валидация ключей, которые находятся на публичных серверах. Т.е. для подтверждения, что владелец ключа на самом деле тот, за кого себя выдаёт.

Протокол подписи ключей под названием "Zimmermann-Sassaman" призван сделать данный процесс очень эффективным. Тут вы можете найти подробную инструкцию на английском.

### Caff

Чтобы сделать процесс подписи ключей и отправку этих подписей владельцам ключей удобным, вы можете воспользоваться программой под названием 'caff'. Установить можно из AUR пакетом caff-svn, либо весь набор удобных инструментов, включающий в себя и 'caff', установив пакет signing-party-svn. В любом случае, придётся установить много зависимостей из AUR. Как альтернатива, вы можете установить их через:

    cpanm Any:Moose
    cpanm GnuPG::Interface

Чтобы отправить подпись владельцу, вам нужен работающий почтовый сервер. Если у вас его нет, установите msmtp.

## Смарт-карты

Обратите внимание: Необходимо установить пакет pcsclite и запустить содержащуюся в нем службу systemd: `pcscd.service`

GnuPG использует scdaemon и интерфейс вашего устройства для чтения смарт-карт. Для получения дополнительной информации, пожалуйста, обратитесь к странице справочного руководства (man) `scdaemon`.

### Настройка только для GnuPG

Если вы не планируете использовать другие карты, кроме основанных на GnuPG, необходимо проверить параметр `reader-port` в файле `~/.gnupg/scdaemon.conf`. Значение '0' относится к первому доступному считывателю последовательного порта, а значение '32768' (по умолчанию) - к первому считывателю USB.

### GnuPG вместе с OpenSC

Если вы используете смарт-карту с драйвером opensc (например, карты ID из некоторых стран), необходимо уделить время настройке GnuPG. Если этого не сделать, при использовании `gpg --card-status` вы можете получить сообщение вроде этого:

    gpg: selecting openpgp failed: ec=6.108

По умолчанию scdaemon попробует подключиться непосредственно к устройству. Эта попытка провалится, если считыватель занят другим процессом, например, если демон pcscd используется OpenSC. Чтобы справиться с этой ситуацией, необходимо использовать тот же драйвер, который лежит в основе opensc, и тогда они смогут нормально вместе работать. Чтобы заставить scdaemon использовать pcscd, необходимо удалить `reader-port` из файла `~/gnupg/scdaemon.conf`, указать место расположения библиотеки `libpcsclite.so` и отключить ccid, чтобы быть уверенным в том, что используется pcscd:

    ~/scdaemon.conf

    pcsc-driver /usr/lib/libpcsclite.so
    card-timeout 5
    disable-ccid

Пожалуйста, проверьте страницу справочного руководства `man scdaemon`, если вы не используете OpenSC.

## Решение проблем

### Su

Чтобы использовать `pinentry`, у вас должны быть корректные настройки прав доступа к устройству терминала (например `/dev/tty1`). Однако, с `su` (или `sudo`) права доступа остаются от прежнего пользователя системы. Из-за этого возникнут проблемы с pinentry, даже от пользователя root. Чтобы исправить эту проблему, измените права доступа к устройству терминала до использования pinentry (например, используя gpg-agent). Использая gpg от пользователя root, просто измените владельца на root перед использованием gpg:

    chown root /dev/ttyN  # где N - текущий tty

Затем верните прежнего владельца после первого запуска gpg. The equivalent is likely to be true with `/dev/pts/`.

Обратите внимание: Добавление пользователя в группу `tty` не решает проблему, как минимум по отношению к пользователю root. (Please confirm with non-superusers)

### GPG-Agent и конец файла (end of file)

По умолчанию используется pinentry-gtk-2, который требует для своей работы DBus-сессию. См. General Troubleshooting#Session permissions.

Как альтернатива, вы можете использовать `pinentry-qt`. См. #Способ запроса пароля (Pinentry).

### Конфигурация прав доступа для KGpg

Некоторые пользователи сталкивались с проблемой, когда kdeutils-kgpg не может получить доступ к опциям в `~/.gnupg/`. Одна из причин может быть в устаревшем файле опций, см. отчёт об ошибке.

Также наблюдались проблемы, когда KGpg не запускается до тех пор, пока права доступа к директории `~/.gnupg` не будут выставлены на `drwxr-xr-x`. В этом случае, убедитесь, что содержимое этой директории остаётся с правами `-rw-------`! Затем, отправьте отчёт об этой ошибке разработчикам (англ.).

## См. также

- The GNU Privacy Handbook
- Более полная инструкция по использованию GPG (англ.)

Categories:

- Русский
- Security (Русский)