Как решать проблемы
*******************

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

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

Средства отладки
================

В дистрибутив GnuPG входит пара средств, полезных для отыскания и решения проблем.

Инспектирование файла щита с ключами
------------------------------------

Щит с ключами — это формат хранения открытых ключей вместе с индексами и сопутствующей информацией. Обычно используется pubring.kbx из каталога .gnupg. Он содержит все сертификаты X.509, а также ключи OpenPGP (Правда, ключи OpenPGP не реализованы, gpg все еще пользуется файлом pubring.gpg.).

При вызове обычным образом, например,

kbxutil ~/.gnupg/pubring.kbx

программа перечисляет все записи (т.н. blobs) вместе с сопутствующей информацией в формате, предназначенном для чтения человеком.

Для просмотра статистики данного щита с ключами набираем

kbxutil --stats ~/.gnupg/pubring.kbx

и видим что-то вроде:

     Total number of blobs:       99
                    header:        1
                     empty:        0
                   openpgp:        0
                      x509:       98
               non flagged:       81
            secret flagged:        0
         ephemeral flagged:       17

В этом примере мы видим, что на щите с ключами нет никаких ключей OpenPGP, но есть 98 сертификатов X.509, а также всего 17 ключей или сертификатов, которые помечены как одноразовые, это значит, что они только временно сохраняются на щите с ключами и не будут показаны обычными командами gpgsm или gpg. 81 сертификат хранится обычным образом и напрямую доступен из gpgsm.

Чтобы найти продублированные сертификаты и блоки ключей в файле щита с ключами (таких не должно быть, но иногда что-то бывает не так), набираем

kbxutil --find-dups ~/.gnupg/pubring.kbx

Разные подсказки по отладке
===========================

  * Как узнать адрес IP сервера ключей

     Если применяется URL с циклическим переключением серверов ключей (напр., subkeys.gnupg.org), узнать, какой же сервер использован, нелегко. Часто помогает параметр отладки серверов ключей:

           gpg --keyserver-options debug=1 -v --refresh-key 1E42B367

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

  * Протокол работы под WindowsCE

     При разработке протокол работы под WindowsCE лучше всего писать с помощью удаленной отладки в файл tcp://<адрес IP>:<порт>. Командой watchgnupg можно пользоваться на удаленной машине, чтобы прослушивать данный порт (see параметр watchgnupg --tcp). Для полевых испытаний лучше пользоваться средством ведения протокола, реализуемом в драйвере gpgcedev (часть libassuan); это включается, когда в качестве имени файла протокола задано GPG2: (see параметр --log-file).

Часто возникающие проблемы
==========================

  * Код ошибки Не поддерживается из dirmngr

     Скорее всего, в gpgsm работает параметр enable-ocsp, но в dirmngr не включена функция OCSP параметром allow-ocsp в файле dirmngr.conf.

  * Программа ввода пароля на базе curses не работает

     В подавляющем большинстве случаев это вызвано тем, что переменная среды GPG_TTY не установлена правильно. Убедитесь, что она указывает на настоящее устройство терминала, а не просто на /dev/tty; т.е. установка GPG_TTY=tty явно неправильна; вам нужно GPG_TTY=`tty` — обратите внимание на знаки `. Также убедитесь, что эта переменная среды экспортируется, т.е. ее установка должна сопровождаться export GPG_TTY (если это оболочка типа Борна). GPG_TTY нужно устанавливать даже для графических программ ввода пароля. О том, как это делать, см. в разделе по установке gpg-agent.

  * SSH зависает, когда ожидается вызов программы ввода пароля

     В SSH нет способа указать программе gpg-agent, какой терминал или дисплей X Window используется. Так что при удаленном входе на машину, на которой работает gpg-agent с поддержкой SSH, программа ввода пароля обращается к тому дисплею, с которого запущен gpg-agent. Чтобы решить эту проблему, можно отдать команду

          echo UPDATESTARTUPTTY | gpg-connect-agent

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

  * Экспорт секретного ключа без сертификата

     Может случиться, что вы с помощью gpgsm создали запрос на подпись сертификата, но еще не получили и не импортировали сертификат удостоверяющего центра. Однако вам может понадобиться немедленно экспортировать секретный ключ на другую машину, чтобы там импортировать его. Для этого есть одна хитрость, но нужно знать приблизительное время, когда вы создали запрос на подпись сертификата. Командой

            ls -ltr ~/.gnupg/private-keys-v1.d

     вы получите список всех секретных ключей под управлением gpg-agent. Выберите ключ, который лучше всего соответствует времени создания, и выполните команду

            LIBEXECDIR/gpg-protect-tool --p12-export \
               ~/.gnupg/private-keys-v1.d/FOO >FOO.p12

     (подставьте свой путь до программы gpg-protect-tool). Здесь FOO — имя файла с ключом, который вы выбрали (у него должен быть суффикс .key). Программа ввода пароля запросит текущую фразу-пароль для ключа и новую фразу-пароль для защиты файла PKCS#12.

     Для импорта созданного файла на новой машине введите команду:

            LIBEXECDIR/gpg-protect-tool --p12-import --store  FOO.p12

     Будет запрошена фраза-пароль PKCS#12 и новая фраза-пароль для защиты импортированного секретного ключа в новом месте.

     Обратите внимание, что простого способа связать существующие сертификаты с сохраненными секретными ключами не существует, потому что одни секретные ключи сохранены для использования с SSH или в других целях, и у них соответствующего сертификата нет.

  * Корневой сертификат не проходит проверку

     Обычная проблема состоит в том, что в корневом сертификате отсутствует обязательный атрибут basicConstraints, таким образом, gpgsm отклоняет этот сертификат. Сообщение об ошибке, указывающее на «no value» (нет значения) является признаком такого сертификата. Чтобы все равно принять такой сертификат, можно воспользоваться признаком relax в файле trustlist.txt. Обратите внимание, что отпечаток и сам этот признак можно добавить в trustlist.txt только вручную.

  * Ошибка: «digest algorithm N has not been enabled» (хеш-функция N не включена)

     Подпись с ошибкой. Обойти проблему можно с помощью параметра --extra-digest-algo SHA256. Число N представляет внутренний идентификатор алгоритма; к примеру, 8 означает SHA-256.

  * Версия для Windows не работает под Wine

     При работе версии gpg для W32 под Wine можно получить такие сообщения об ошибках:

          gpg: fatal: WriteConsole failed: Access denied

     Это можно решить командой wineconsole.

     Некоторые операции, такие как --generate-key, в целях повышения безопасности обязательно требуют прямой связи с консолью (например, чтобы предотвратить появление фразы-пароля на экране). Таким образом, вместо wine надо пользоваться командой wineconsole, которая запустит консоль, в которой реализованы эти дополнительные особенности.

  * Почему команда gpg --search-key показывает странные ключи?

     Для повышения быстродействия серверы ключей не проверяют ключи так, как это делает gpg. Может случиться, что в списке ключей, доступных на серверах, будут показаны ключи с неправильными идентификаторами пользователя или с идентификаторами пользователя из других ключей. Но если попробовать импортировать такой ключ, плохие ключи или плохие идентификаторы пользователя импортированы не будут. Это немного досадно, но мы не можем ничего с этим поделать, пока не получим с сервера сами ключи.

Как все это работает внутри
===========================

Как связаны компоненты
----------------------

Figure: Обзор модулей GnuPG
модули GnuPG

Связь между GnuPG 1.4 и 2.x
---------------------------

Вот небольшая иллюстрация, показывающая, как различные версии GnuPG пользуются электронной картой:

Figure: архитектура карт GnuPG
архитектура карт GnuPG