
Почти все знают что такое GPG. Многие им пользуются. Некоторые даже в курсе, что есть возможность хранить секретные ключи на внешнем носителе типа смарт-карты. Я-же хочу описать как это все выглядит на практике.
Несколько дней назад ко мне приехала пара «OpenPGP SmartCard v2». Заказаны они были у официального их распространителя — shop.kernelconcepts.de/index.php?language=en. Цена одной карты на данный момент составляет 17.14 евро. Две заказанные карты были отправлены чем-то вроде заказного письма и пересылка обошлась мне в 5 евро, что очень даже неплохо. Еще порадовало что карты без проблем прошли через таможню. Не уверен что так будет с большим количеством, но для личного использования, думаю, можно заказывать достаточно безопасно.
И вот они у меня…

Обе упакованы в отдельные пакетики и в каждом памятка о PIN-кодах по умолчанию и о трех попытках ввода.
Чуть ранее для изучения различных смарт-карт я приобрел карт-ридер модели SCR331. OpenPGP карты им читаются не хуже других.
Первым делом для работы (Ubuntu 10.04 LTS) необходимо запустить сервис pcscd. После этого вставляем карту и делаем команду pcsc_scan. Если все нормально, в консоль выводятся технические данные карты.
Далее пробуем посмотреть карту через gpg (здесь на карте уже есть ключи):
$ gpg --card-status gpg: detected reader `SCM SCR 331 (21121046203464) 00 00' Application ID ...: D2760001240102000005000010C00000 Version ..........: 2.0 Manufacturer .....: ZeitControl Serial number ....: 000010C0 Name of cardholder: [не установлено] Language prefs ...: de Sex ..............: [не установлено] URL of public key : [не установлено] Login data .......: [не установлено] Private DO 1 .....: [не установлено] Private DO 2 .....: [не установлено] Signature PIN ....: форсировано Key attributes ...: 2048R 1024R 2048R Max. PIN lengths .: 32 32 32 PIN retry counter : 3 0 3 Signature counter : 6 Signature key ....: 4F3B 52C3 23FF 3931 6774 E694 3D10 7955 72D5 82DB created ....: 2011-10-18 11:52:30 Encryption key....: 82CB 2DB7 7DDD 6E56 5CB6 21B9 598A 49D6 B3F3 F028 created ....: 2011-10-18 11:52:30 Authentication key: F159 6F7E D472 5CD0 7161 F00E 554E 78F8 CABD 115C created ....: 2011-10-18 11:52:30 General key info..: pub 2048R/72D582DB 2011-10-18 John Smith <john@smith.org> sec> 2048R/72D582DB создан: 2011-10-18 годен до: никогда номер карты: 0005 000010C0 ssb> 2048R/CABD115C создан: 2011-10-18 годен до: никогда номер карты: 0005 000010C0 ssb> 1024R/B3F3F028 создан: 2011-10-18 годен до: никогда номер карты: 0005 000010C0
С помощью команды «gpg --card-edit» можно изменить персональные данные: имя владельца, предпочитаемый язык, пол и другие. Очень интересное поле «URL of public key», но об этом чуть дальше.
Так-же, с помощью команды «gpg --card-edit» можно сгенерировать ключи на карте. При этой процедуре в базу GPG в файловой системе попадает открытый ключ и псевдо-секретный ключ, в котором сам секретный ключ заменен заглушкой, указывающей на то, что он реально находится на смарт-карте.
Ну и что-же дальше? Дальше мне лично стали интересны два вопроса:
- Можно-ли сделать на карте резервную копию своего обычного ключа что-бы пользоваться ею в случае утери обычного?
- Самодостаточен-ли ключ на смарт-карте что-бы с ее помощью, например, организовать работу с чужого компьютера?
Резервная копия существующего ключа
На основании своих экспериментов предполагаю, что оптимальный порядок создания резервной копии своего ключа на карте следующий:
- Создать бэкап секретного ключа на диске командой «gpg --export-secret-key <id ключа>»;
- Зайти в ключ с помощью команды «gpg --edit-key <id ключа>»;
- Перейти в часть секретных ключей командой «toggle»;
- Командой «keytocard» переносим ключ для подписания. В следующем диалоге выбираем строку «Ключ для подписания»;
- Переключаемся на следующий ключ, служащий для шифрования, командой «key 1»;
- Командой «keytocard» переносим ключ на карту. В следующем запросе gpg должен выдать один вариант — «Ключ для шифрования». Выбираем его и ждем переноса.
- Выходим командой «save»;
- Удаляем секретный ключ командой «gpg --delete-secret-key <id ключа>»;
- Восстанавливаем секретный ключ из резервной копии командой «gpg --import <имя файла>»;
После этого у вас на карте будут находится резервные копии ваших секретных ключей.
Самодостаточность ключа на смарт-карте
В процессе изучения выяснилось, что для того, что-бы «подгрузить» описание секретных ключей со смарт-карты в базе GPG должен присутствовать открытый ключ, связанный с ключами на карте (обычный открытый ключ данной связки).
Тогда для «синхронизации» базы с картой достаточно выполнить команду «gpg --card-status». После ее выполнения секретные ключи-заглушки создадутся в базе GPG и ключем можно полноценно пользоваться.
Что-бы не таскать везде с собой свой публичный ключ, можно воспользоваться размещением его в интернете (в виде файла, доступного по http, или на одном из серверов ключей) и указанием расположения вашего публичного ключа в параметре карточки «URL of public key». Я проверил работу этого свойства, указав в нем url hkp сервера, на котором присутствует мой публичный ключ.
При наличии корректной записи в параметре карты «URL of public key», подготовка карты к работе на новом месте (естественно, при наличии доступа в интернет) сводится к выполнению двух команд:
- gpg --card-edit и последющей командой fetch в оболочке gpg;
- gpg --card-status
После этого вы имеете на системе свой полноценный ключ и можете с ним работать.
Использование
Использование GPG совместно со смарт-картой почти ничем не отличается от обычного использования. Кроме того, что вместо ключевой фразы вам нужно вводить пин-код карты. Если карта не вставлена в карт-ридер, при операциях с ключем в консольном режиме выдается сообщение о необходимости вставить карту.
К сожалению, обнаружилось что имеющаяся у меня версия оболочки GPA (0.9.0) не умеет корректно работать с ключами на смарт-карте. Она почему-то не ожидает ввода пин-кода карты, а сразу выдает что операция не может быть завершена. Хотя, где-то в соседнем окошке висит окно запроса пин-кода. Возможно, в других оболочках дело обстоит лучше. Ну, и, конечно, радует что хотя-бы из консоли все нормально работает.
В общем, хранить секретные ключи на смарт-карте, конечно, намного более безопасно чем в базе ключей на компьютере или на флэшке. И, разумеется, существенно более удобно при перемещении и необходимости организации работы с GPG с незнакомых компьютеров.