Настройка gpg-подписи для Yandex.Деньги

Нам необходим ключ для подписывания наших запросов. Для работы с PGP используется нативная утилита GnuPG (gpg), установленная в системе, и её хранилище ключей. Вкратце рассмотрим настройку и работу утилиты. Инструкция приведена для версии gpg (GnuPG) 1.4.11 под linux.

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

Прежде всего нужно сгенерировать свою пару открытый/закрытый ключ:

$gpg --gen-key

При этом выбирается нужный тип ключа (например, для работы Yandex.Money выбирается "(4) RSA (только для подписи)" ); выбирается длина; выбирается срок действия.

Далее формируется UserID (имя, e-mail, комментарий) в таком виде: "dimon (first key) <dimon@***.ru>". Три параметра вводятся по очереди или сразу, зависит от реализации.

Наконец, вводится пароль для доступа к ключу. Предположим, мы ввели "123456". По этому паролю в некоторых реализациях и в некоторых случаях будет идентифицироваться ключ. В вышеприведённой конфигурации этот пароль указывается в параметре GpgPassPhrase для соответствующей валюты.

После некоторых дополнительных указаний сгенерируются (открытый и закрытый) ключи.

Можно посмотреть на ключ:

$ gpg --list-key
/home/dimon/.gnupg/pubring.gpg
------------------------------
pub 2048R/F99D7F2B 2010-11-08
uid dimon (first key) <dimon@***.ru>

Аналогично смотрятся секретные ключи:

$ gpg --list-secret-keys
/home/dimon/.gnupg/secring.gpg
------------------------------
sec 2048R/F99D7F2B 2010-11-08
uid dimon (first key) <dimon@***.ru>

Чтобы отослать свой ключ получателю (в нашем случае менеджерам Yandex.Деньги) его надо экспортировать в файл. Выгрузим в текстовом (не бинарном) виде:

$gpg --export --armor > mykey.asc

Получится файл mykey.asc с вашим ключом:

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.11 (GNU/Linux)
 
mQENBEzXmH8BCADJE6LkH9i4+Q96OzuvrSnAK9u9xxmp3x05FtGLswUNn6n0Ux7X
eBLGTQn+aT1KG1gc6O8c0l87A1hWk/VIE9ipCIbccY8xa1SWBcjHHtZIxYPG5ToM
q4jWuW7WJzgpZV6TuJYrfzz+iX/SQOfn0gav61ZoNCcLQ+Ypzz075r1Ax/S/Kfin
fiUyjjqDZI1ajfE1jWgXn/nxnWQ7DD5P2FJ4/HBR7HF7EABqo+TLk74hbYISoPWw
pAnYPzVn0tlXlhWI6CgIHx8YC9xhBA5LsmZk1SBKZhviSMCFuGCQnFpXFyX8fmfU
TCfJTFMDnBFAEPRJKeG5G2/Ahe2IrlwoSXB7ABEBAAG0ImRpbW9uIChmaXJzdCBr
ZXkpIDxkaW1vbkBiaXRlbC5ydT6JATgEEwECACIFAkzXmH8CGwMGCwkIBwMCBhUI
AgkKCwQWAgMBAh4BAheAAAoJEE3+EBD5nX8rWdcH/2w/VpmlgYOHAphC9zXsTv09
K4jNaLV6BwG0XqW1Af3Y49tDYpv9zaobtV/yRd0gaZo2rONTXlb4GGpBsbPBWwkg
eYb/z+7AZm0auCEYlc4Fk9J7QN0NvbGccw+I6dRIrykK+VwZUS4+nQB+EIDoR33U
zaT47IPqi1HkYiRpxB3B/4axMiTjfx28gdzX3EICQtMNEDczcPCYsYCB9A2y2XBd
N4OUWanrceEvUeEhPa4rR/sYpvg3JZv44Asm7du3GprYnlFcoeSdmeJ/Bl/au+eU
8gvzDCEVBmUNRyG1cTXgfoJqcFVLULoASwfAYVfJQVRMBP60ecz4wPMxhHvV2Gc=
=Cgdy
-----END PGP PUBLIC KEY BLOCK-----

Дальше нужно импортировать выдаваемые второй стороной ключи. Нужный в данный момент имеет имя "Yandex.Money Payment Gate.asc".

$ gpg --import ./Yandex.Money\ Payment\ Gate.asc
gpg: ключ B0B2F0D8: открытый ключ "Yandex.Money Demo Payment Center (Yandex.Money Demo Payment Center) <demopaymentcenter@yamoney.ru>" импортирован
gpg: Всего обработано: 1
gpg: импортировано: 1

Второй ключ - "Yandex.Money Online Registry Key.asc" - тоже пригодится в последующем.

$ gpg --import ./Yandex.Money\ Online\ Registry\ Key.asc
gpg: ключ ACE74CE2: открытый ключ "Yandex.Money Online Registry Key <onreg@yamoney.ru>" импортирован
gpg: Всего обработано: 1
gpg: импортировано: 1

Можно убедиться, что теперь открытых ключей стало больше (наш закрытый, конечно, остался один):

$ gpg --list-key
/home/dimon/.gnupg/pubring.gpg
------------------------------
pub 2048R/F99D7F2B 2010-11-08
uid dimon (first key) <dimon@***.ru>
 
pub 1024D/B0B2F0D8 2008-05-29
uid Yandex.Money Demo Payment Center (Yandex.Money Demo Payment Center) <demopaymentcenter@yamoney.ru>
sub 2048g/2A9A05C6 2008-05-29
 
pub 1024D/ACE74CE2 2006-10-05
uid Yandex.Money Online Registry Key <onreg@yamoney.ru>
sub 2048g/BCD3ACEF 2006-10-05

Пример того, как это все работает (вывод на экран в бинарном виде).

Подпись файла test.txt:

$ gpg --armor --output - --sign --passphrase 123456 test.txt
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.10 (GNU/Linux)
 
owEBPgHB/pANAwACAXzF27f83iK8AawOYgR0ZXN0S6h2SXRlc3SJARwEAAECAAYF
AkuodkkACgkQfMXbt/zeIrwE6Qf/bNGgTUytFAuPaInkx49L8DQyUx72Lra9uOin
TCfaRPZJlwjt4wdsF0FYYLuFYoQ25WwfVmdZwTwfvd1qV+drWBJKZx/s8t0WDrnw
0rQL9JainBkojNdmcGfa3UMEAYLQgXezpGwZtQ4iURjVbChH52lR3NFDGjt+fR8p
dVSdjz7owhTldC08ceVSKLDagW+XFYC9OaeWjDvLKN2dsYbeWL1g0VjmzSHHPjFG
XL8J90FpTymL/DZZsnOWUxUmEU7ymZ14NAwtOV9jjyGjYL8bGSDymJEqttXKJWbO
ZlHUbzJG23m2YK1BoW7ojNbAD8ilrIMWyjCa6id+OB29lJXzzA==
=IhW8
-----END PGP MESSAGE-----

Подпись и шифрование для отправки сверки на Яндекс:

$ gpg --armor --output - --encrypt -r BCD3ACEF --sign --passphrase 123456 ./test.txt

В данном случае файл будет зашифрован указанным ключём Яндекса и подписан нашим ключом по умолчанию (он устанавливается командой gpg --default-key), либо первым ключом в секретном хранилище.

Могут возникнуть проблемы:

Недоверие ключу:

gpg: BCD3ACEF: Нет свидетельств того, что данный ключ принадлежит пользователю, указанному в User ID ключа

и запрос всё время доверять или нет. Надо установить уровень доверия ключу:

$ gpg --edit-key BCD3ACEF

И далее вводится "trust" и выбрать "доверять абсолютно", потом "quit".

Также, как вариант, можно использовать --trust-model always или --always-trust, но не нужно.