GNUK на BluePill 3
Применяем токен на практике.
/| .----. |\
/ | __ | | __ | \
| .Y` `\| |/` `Y. |
| | `--` | |
\| ,----, |/
| / \ |
| | | |
| / ) GNUK ( \ |
\/ /| |\ \/
| | \ / | |
| |\ ~----~ /| |
| | ~-.______.-~ | |
| \ ___ ____/ |
\ ~~~~ /
~ - .____. - ~
Помимо стандартных операции GnuPG, токен позволяет работать и с другими программами.
Заметка: Команды выполнены на реальном оборудовании, результат может отличаться от вашего.
Git
Git - это распределенная программная система управления версиями, которая способна управлять версиями исходного кода или данными. Она часто используется для управления исходным кодом программистами, которые совместно разрабатывают программное обеспечение.
Включаем автоматическую подпись коммитов и тэгов:
$ git config --global user.signingkey B6C5D439AF2E62B5
$ git config --global commit.gpgsign true
$ git config --global tag.gpgsign true
pass
pass - это менеджер паролей, вдохновленный философией Unix. Он имеет интерфейс командной строки и использует GnuPG для шифрования и расшифровки сохранённых паролей.
Устанавливаем pass:
$ sudo pacman -S pass
Бонус: Устанавливаем qtpass, графическую оболочку
pass:
$ sudo pacman -S qtpass
Инициализируем новое хранилище:
$ pass init B6C5D439AF2E62B5
OpenSSH
OpenSSH (англ. Open Secure Shell - открытая безопасная оболочка) - набор программ, предоставляющих шифрование сеансов связи по компьютерным сетям с использованием протокола SSH.
Демон gpg-agent позволяет вести себя как
ssh-agent для использования ключей PGP вместо SSH.
Включаем поддержку SSH в gpg-agent:
$ echo "enable-ssh-support" >> .gnupg/gpg-agent.conf
Добавляем в ~/.bashrc:
export GPG_TTY=$(tty)
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
gpgconf --launch gpg-agent
gpg-connect-agent updatestartuptty /bye > /dev/null
Активируем настройки:
$ source ~/.bashrc
Выводим публичный ключ:
$ ssh-add -L
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIfz/UvJIYooSuuPsAJZZtgOrlEkt7NZA0Vyt3PG/AUZ cardno:FFFE_4314351B
Добавляем ключ через ssh-copy-id или вручную в
~/.ssh/authorized_keys:
$ ssh-copy-id lessavin.ru
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ssh-add -L
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
lessavin@lessavin.ru's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'lessavin.ru'"
and check to make sure that only the key(s) you wanted were added.
Mozilla Thunderbird
Mozilla Thunderbird - бесплатная кроссплатформенная свободно распространяемая с открытым кодом программа для работы с электронной почтой и группами новостей, а при установке расширения Lightning, и с календарём.
Про умолчанию почтовый клиент использует только импортированные ключи. Чтобы использовать его вместе с токеном необходимо включить экспериментальную функцию и указать публичный ключ.
Переходим в настройки:
Thunderbird Settings
`-> Config Editor
Разрешаем внешний GnuPG:
mail.openpgp.allow_external_gnupg: false -> true
Опционально: Включаем шифрование для новых писем (вместо "X" указать порядковый номер аккаунта):
mail.identity.idX.sign_mail: false -> true
mail.identity.idX.encryptionpolicy: 0 -> 2
Добавляем токен:
Account Settings
`-> End-To-End Encryption
`-> Add Key...
`-> User your external key through GnuPG (e.g. from a smartcard)
Указываем ID и путь публичного ключа.
Poldi
Poldi - это модуль PAM, использующий инфраструктуру смарт-карт GnuPG.
Собираем Poldi из AUR:
$ git clone https://aur.archlinux.org/poldi-git.git
$ cd poldi-git
$ makepkg -si
Включаем модуль:
echo "auth sufficient pam_poldi.so >> /etc/pam.d/system-auth"
Создаём базу данных:
# mkdir -p /etc/poldi/localdb/keys/
# touch /etc/poldi/localdb/keys/D276000124010200FFFE4314351B0000
Закрепляем токен за пользователем и передаём управление:
# echo "D276000124010200FFFE4314351B0000 lessavin" >> /etc/poldi/localdb/users
# chown lessavin /etc/poldi/localdb/keys/D276000124010200FFFE4314351B0000
Добавляем токен:
$ gpg-connect-agent "/datafile /etc/poldi/localdb/keys/D276000124010200FFFE4314351B0000" "SCD READKEY --advanced OPENPGP.3" /bye
Scute
Scute является поставщиком PKCS#11 поверх GnuPG, что позволяет использовать смарт-карты с поддержкой GnuPG с помощью служб сетевой безопасности Mozilla и другого программного обеспечения, поддерживающего спецификацию PKCS#11
UPD 2026-07-27: К сожалению, X.509 не реализован под Ed25519, используемый в этом посте. Используйте стойкую (не менее 2048-бит) пару RSA ключей:
Одна из причин, по которой эта технология (X.509 на Ed25519) не получила широкого распространения, заключается в том, что для TLS-сертификатов CA/Browser Forum разрешает центрам сертификации выдавать только сертификаты RSA и NIST. Это можно увидеть на странице https://cabforum.org/working-groups/server/baseline-requirements/documents/CA-Browser-Forum-TLS-BR-2.0.9.pdf#3a, а соответствующий запрос на внесение изменений, который был отклонен, находится по адресу https://github.com/cabforum/servercert/issues/451.
- John Scott, Certificate Authority using ed25519 key on Gnuk? (перевод)
Внимание: Из-за ошибки следующие команды не были повторены на реальном оборудовании. Результат может отличаться от вашего.
Собираем Scute из AUR:
$ git clone https://aur.archlinux.org/scute.git
$ cd scute
$ makepkg -si
Создаём CSR:
$ gpgsm --gen-key > floppy-head.csr
Please select what kind of key you want:
(1) RSA
(2) Existing key
(3) Existing key from card
Your selection? 3
Serial number of the card: 355F9746499F0D4B4ECEE4928B007D16
Available keys:
(1) D53137B94C38D9BF6A199706EA6D5253 OPENPGP.1
(2) B0CD1A9DFC3539A1D6A8B851A11C8665 OPENPGP.2
(3) 53DB41052CC590A40B403F3E6350E5DC OPENPGP.3
Your selection? 3
Possible actions for a RSA key:
(1) sign, encrypt
(2) sign
(3) encrypt
Your selection? 2
Enter the X.509 subject name: CN=Floppy Head,OU="Webserver Team",O="Snake Oil, Ltd",L="Snake Town",ST="Snake Desert",C=XY
Enter email addresses (end with an empty line):
> floppy.head@example.org
>
Enter DNS names (optional; end with an empty line):
>
Enter URIs (optional; end with an empty line):
>
Create self-signed certificate? (y/N) n
These parameters are used:
Key-Type: card:OPENPGP.3
Key-Length: 1024
Key-Usage: sign
Name-DN: CN=Floppy Head,OU="Webserver Team",O="Snake Oil, Ltd",L="Snake Town",ST="Snake Desert",C=XY
Name-Email: floppy.head@example.org
Proceed with creation? (y/N) y
Now creating certificate request. This may take a while ...
gpgsm: about to sign the CSR for key: &53DB41052CC590A40B403F3E6350E5DC
gpgsm: certificate request created
Ready. You should now send this request to your CA.
Подписываем запрос в CA или сами:
$ openssl ca -in floppy-head.csr -cert snakeoil-ca-rsa.crt -keyfile snakeoil-ca-rsa.key -out floppy-head.crt
Импортируем сертификат в приложения и gpgsm:
$ gpgsm --import /tmp/floppy.crt
gpgsm: total number processed: 1
gpgsm: unchanged: 1
В продуктах Mozilla добавляем Scute в качестве модуля безопасности:
Settings
`-> Privacy and security
`-> Manage security devices
`-> Load
Указываем имя модуля и путь к scute.so.
Заключение
Теперь когда мы знаем как применять токен, его можно собирать в корпус под РЭА и заливать компаундом.
В заключительной части мы рассмотрим известные уязвимости (они есть везде) и методы их противодействия.