离线Ed25519 OpenPGP密钥,FST-01G上的子密钥运行Gnuk

下面我将描述如何生成OpenPGP密钥并将其子密钥导入到运行Gnuk的FST-01G设备。请参阅我之前在上的帖子计划我的新OpenPGP密钥和上的帖子准备FST-01G以运行Gnuk。为了与基于RSA/YubiKey的方法进行比较,您可以阅读我的从2014年开始设置

以下大多数步骤都包含在Gnuk手册对我来说,最主要的困难是使用离线机器并将GnuPG目录存储在USB存储设备上。

脱机计算机

我使用一台未连接到互联网的笔记本电脑,并从只读USB记忆棒引导它。找到一张包含将GnuPG与智能卡(gpg-agent、scdaemon、pcscd)结合使用所需工具的live CD要比实际情况困难得多。使用一个很少被审核的图像会回避一个问题,即你是否可以信任它。一个打补丁的内核/gpg会产生很差的随机性,这将是一个很容易也很难注意到的黑客行为。我正在使用PGP/PKI洁净室现场CD对于更广泛使用和经审计的替代方案的建议将不胜感激。选择“高级选项”和“运行Shell”以退出菜单。插入一个新的USB存储设备,并按以下步骤进行准备:

pgp@pgplive:/home/pgp$sudo-wipefs-a/dev/sdXpgp@pgplive:/home/pgp$sudo-fdisk/dev/sdX#创建Linux类型的主分区pgp@pgplive:/home/pgp$sudo mkfs.ext4/dev/sdX1pgp@pgplive:/home/pgp$sudo-mount/dev/sdX1/mntpgp@pgplive:/home/pgp$sudo-mkdir/mnt/gnupghomepgp@pgplive:/home/pgp$sudo-chown pgp.pgp/mnt/gnuphomepgp@pgplive:/home/pgp$sudo-chmod go-rwx/mnt/gnupghome

GnuPG配置

将GnuPG主目录设置为指向gnupghome卫星USB存储设备上的目录。您需要在打开的每个终端窗口中使用GnuPG。

pgp@pgplive:/home/pgp$export GNUPGHOME=/mnt/GNUPGHOMEpgp@pgplive:/home/pgp$

此时,您应该能够运行gpg—卡状态并从智能卡获取输出。

创建主密钥

创建一个主密钥,并用它备份GnuPG主目录,以及一个导出ASCII版本。

pgp@pgplive:/home/pgp$gpg--quick-gen-key“Simon Josefsson<simon@josefsson.org>“ed25519标志216dgpg:keybox'/mnt/gnupghome/pubring.kbx'已创建gpg:/mnt/gnupghome/trustdb.gpg:trustdb已创建gpg:密钥D73CF638C53C06BE标记为最终可信gpg:目录'/mnt/gnupghome/openpgp-revocs.d'已创建gpg:吊销证书存储为“/mnt/gnupghome/openpgp-revocs.d/B1D2BD1375BECB784CF4F8C4D73CF638C53C06BE.rev”发布日期:25519 2019-03-20[SC][有效期:2019-10-22]B1D2BD1375BECB784CF4F8C4D73CF638C53C06BEB1D2BD1375BECB784CF4F8C4D73CF638C53C06BEuid西蒙·约瑟夫森<simon@josefsson.org>pgp@pgplive:/home/pgp$gpg-a--导出密钥B1D2BD1375BECB784CF4F8C4D73CF638C53C06BE>$GNUPGHOME/masterkey.txtpgp@pgplive:/home/pgp$sudo cp-a$GNUPGHOME$GNUPGMEBackup-masterkeypgp@pgplive:/home/pgp$

创建子项

创建子密钥并对其进行备份,如下所示。

pgp@pgplive:/home/pgp$gpg--快速添加密钥B1D2BD1375BECB784CF4F8C4D73CF638C53C06BE cv25519 encr 216dpgp@pgplive:/home/pgp$gpg--快速添加键B1D2BD1375BECB784CF4F8C4D73CF638C53C06BE ed25519 auth 216dpgp@pgplive:/home/pgp$gpg--快速添加键B1D2BD1375BECB784CF4F8C4D73CF638C53C06BE ed25519标志216dpgp@pgplive:/home/pgp$gpg-a--导出密钥B1D2BD1375BECB784CF4F8C4D73CF638C53C06BE>$GNUPGHOME/mastersubkeys.txtpgp@pgplive:/home/pgp$gpg-a--导出机密子密钥B1D2BD1375BACB784CF4F8C4D73C638C53C06BE>$GNUPGHOME/subkeys.txtpgp@pgplive:/home/pgp$sudo cp-a$GNUPGHOME$GNUPGROME-backup-mastersubkeyspgp@pgplive:/home/pgp$

将钥匙移动到卡上

根据需要设置管理员PIN、PIN、您的全名、性别、登录帐户和密钥URL,然后按照Gnuk卡个性化手册

将子键从GnuPG密钥环移动到FST01G使用keytocard命令

进行最后一次备份,因为将子密钥移动到卡上会修改本地GnuPG密钥环,并创建一个ASCII铠装版本的公钥,以传输到您的日常机器。

pgp@pgplive:/home/pgp$gpg--列表机密密钥/mnt/gnuphome/pubring.kbx--------------------------sec ed25519 2019-03-20[SC][有效期:2019-10-22]B1D2BD1375BECB784CF4F8C4D73CF638C53C06BEuid[终极版]西蒙·约瑟夫森<simon@josefsson.org>ssb>cv25519 2019-03-20[E][有效期:2019-10-22]ssb>ed25519 2019-03-20[A][有效期:2019-10-22]ssb>ed25519 2019-03-20[S][有效期:2019-10-22]pgp@pgplive:/home/pgp$gpg-a--导出密钥B1D2BD1375BECB784CF4F8C4D73CF638C53C06BE>$GNUPGHOME/masterstubs.txtpgp@pgplive:/home/pgp$gpg-a--导出secret-subkeys B1D2BD1375BECB784CF4F8C4D73CF638C53C06BE>$GNUPGHOME/subkeysstubs.txtpgp@pgplive:/home/pgp$gpg-a--导出B1D2BD1375BECB784CF4F8C4D73CF638C53C06BE>$GNUPGHOME/publickey.txtpgp@pgplive:/home/pgp$cp-a$GNUPGHOME$GNUPGROME-backup-masterstubspgp@pgplive:/home/pgp$

转移到日常机器

将publickey.txt复制到您的日常笔记本电脑,然后导入它并使用创建存根--卡片状态

茉莉@拿铁:~$gpg--导入<publickey.txtgpg:密钥D73CF638C53C06BE:公钥“Simon Josefsson<simon@josefsson.org>“已导入gpg:处理的总数:1gpg:导入:1茉莉@拿铁:~$gpg--卡状态读卡器………..:日本Gnuk自由软件倡议(FSIJ-1.2.14-67252015)00 00应用程序ID…:D276000124010200FFFE672520150000版本………:2制造商…..:非托管序列号范围序列号。。。。:67252015持卡人姓名:Simon Josefsson语言首选项…:sv公司性别…………:男性的公钥的URL:https://josefsson.org/key-20190320.txt登录数据…….:茉莉花签名PIN….:不是强迫的关键属性…:ed25519 cv25519 ed25519最大PIN长度:127 127 127PIN重试计数器:3 3 3签名计数器:0签名密钥……:A3CC 9C87 0B9D 310A BAD4 CF2F 5172 2B08 FE47 45A2创建。。。。:2019-03-20 23:40:49加密密钥….:A9EC 8F4D 7F1E 50ED 3DEF 49A9 0292 3D7E E76E BD60创建。。。。:2019-03-20 23:40:26身份验证密钥:CA7E 3716 4342 DF31 33DF 3497 8026 0EE8 A9B9 2B2B创建。。。。:2019年3月20日23:40:37常规密钥信息..:子版本25519/51722B08FE4745A2 2019-03-20西蒙·约瑟夫森<simon@josefsson.org>sec ed25519/D73CF638C53C06BE创建时间:2019-03-20到期时间:2019-10-22ssb>cv25519/02923D7EE76EBD60创建时间:2019-03-20到期时间:2019-10-22卡号:FFFE 67252015ssb>ed25519/80260EE8A9B92B2B创建时间:2019-03-20到期时间:2019-10-22卡号:FFFE 67252015ssb>ed25519/51722B08FE4745A2创建时间:2019-03-20到期时间:2019-10-22卡号:FFFE 67252015茉莉@拿铁:~$

在导入后可以使用密钥之前,必须更新密钥的信任数据库

现在,您应该有一个带有子密钥存根的脱机主密钥。请注意,在下面的输出中,主密钥不可用(秒#),子密钥是智能卡密钥的存根(ssb>)。

茉莉@拿铁:~$gpg--列表机密密钥sec#ed25519 2019-03-20[SC][有效期:2019-10-22]B1D2BD1375BECB784CF4F8C4D73CF638C53C06BEuid[终极版]西蒙·约瑟夫森<simon@josefsson.org>ssb>cv25519 2019-03-20[E][有效期:2019-10-22]ssb>ed25519 2019-03-20[A][有效期:2019-10-22]ssb>ed25519 2019-03-20[S][有效期:2019-10-22]茉莉@拿铁:~$

如果正确设置了环境变量,SSH应该会自动找到身份验证密钥。

茉莉@拿铁:~$ssh-add-Lssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAILzCFcHHrKzVSPDDarZPYqn89H5TPaxwcORgRg+4DagE卡号:FFFE67252015茉莉@拿铁:~$

GnuPG和SSH现在可以与新密钥一起使用了。谢谢你的阅读!

9回复“Offline Ed25519 OpenPGP key with subkeys on FST-01G running Gnuk”

    • 你好,布莱恩!谢谢你的链接,这是一个很好的演练!

      我考虑过是否在主密钥上包含S位,我这样做的原因纯粹是为了能够使用脱机密钥对语句(例如转换语句)进行签名。子键更有可能被破坏,我不希望它们签名的语句被解读为主密钥的密钥转换语句。不过,这是一个微妙的问题,我不认为大多数阅读密钥转换语句的人都会考虑这个方面,并确保它是由主密钥而不是子密钥签名的。

      这就是我在主密钥中包含S位的原因。包含S位还有什么其他原因?不包括S位有什么原因?我很好奇,也许有可能建立一个基于理性论证的最佳实践。或者我们遇到的情况是,这取决于密钥的使用情况以及密钥所有者的偏好。不过,更多的讨论将是有益的🙂

      /西蒙

  1. Pingback:Debian 10 Buster上GNOME下的OpenPGP智能卡–Simon Josefsson的博客

  2. 你好。

    谢谢你的帖子。

    为什么加密子密钥使用CV25519,身份验证/签名/认证使用ED25519?

    谢谢。

  3. Pingback:Debian 11 Bullseye上带有GNOME的OpenPGP智能卡–Simon Josefsson的博客

  4. Pingback:FST-01SZ上的OpenPGP密钥–Simon Josefsson的博客

  5. Pingback:Nitrokey Start上的OpenPGP主密钥–Simon Josefsson的博客

  6. Pingback:如何信任机器——西蒙·约瑟夫森的博客