我之前写过有关尝试保护数字生活的文章。 我花了一些时间来研究想法并与他人交谈。 我很清楚,通过GnuPG迁移到PGP是第一步。 我可以将PGP与YubiKey(Neo模型)一起使用来保护数字生活的大部分。 这篇文章详细说明了我如何达到期望的最终状态:
- 安全生成和存储的PGP密钥
- 存储在我的YubiKey上的私钥
- 当我的YubiKey插入时通过gpg进行SSH访问
- 通过YubiKey进行git commit签名
- 所有这些都可以在最新的macOS上运行
对我来说,这是一段绊脚石,但最终我成功了。 希望这篇文章对您自己的安全实践有所帮助。
步骤1:安装软件
因为安装了gpg 2.0,所以我在该区域出现了一些错误。 2.1是较新的“现代”版本。 该设置可能适用于gpg 2.0,但未经测试。 我假设您已经在计算机上安装了brew
。 您将需要gpg
和YubiKey工具。 YubiKey工具可以安装为GUI或CLI。
酿造水龙头自制/版本
酿造安装gnupg21 pinentry-mac
现在,对于YubiKey特定的位。 一些指南提到CLI或使用GUI。 这些工具可配置YubiKey的模式。 YubiKey必须处于CCID模式。 YubiKey支持多种模式,因此不会影响您当前的YubiKey的功能。 我之所以这么称呼是因为我遵循的一些指南没有涵盖这一部分。
brew install ykneomgr#如果需要ykpersonalize CLI
brew cask install yubikey-neo-manager#如果需要GUI
这应该足以使您前进。
步骤2:配置YubiKey
这一步被扔到我阅读的指南的中间或结尾。 我认为现在最好覆盖一下,因为本指南全是从一开始就配置gpg
和YubiKey。
将YubiKey模式设置为OTP / U2F / CCID。
其他指南使用ykpersonalize
命令。 这支持较旧的Yuibkeys。 ykneomgr
适用于新型号。 ykpersonalize
示例也做同样的事情。
ykneomgr --set-mode = 6
或者,如果您更喜欢使用GUI:

本示例显示所需的最终状态。 您可能只在窗口中看到“ OTP + UTF”。 通过按“更改连接模式”按钮更改它。 选中所有复选框,然后按照屏幕上的说明进行操作。 系统将提示您拔下插头,然后重新插入YubiKey。 激活CCID后,您应该在左侧看到可用应用程序的列表。
更改YubiKey引脚
YubiKey使用两个PIN。 管理员PIN码可确保卡的操作安全。 普通垃圾箱可确保从卡中读取数据 。 默认Admin PIN是12345678
,默认PIN是123456
。 我强烈建议您在继续操作之前先进行更改。 请参阅本优秀指南中的说明。 阅读指南时请牢记以下几点:
- 该指南是针对Linux编写的。 在示例中,将
gpg
替换为gpg2
。 - PIN码必须至少6个字符长。 您可以将其更改为更短的值,但是稍后会破坏情况。
- 更改之前,您可能需要“取消阻止PIN码”。 如果您不知道,请使用默认PIN
123456
。
记住管理员密码和常规密码。 需要密钥时,系统会提示您输入通用密码。
检查您的YubiKey功能
这对我来说是另一个绊脚石。 我有一个较旧的YubiKey,它仅支持2048位密钥。 后来由于我的4096位PGP密钥无法写入YubiKey而中断了该过程。 您可以通过检查卡状态并阅读主要功能来找到答案。
$ gpg2 --card-status | grep -Fi'关键属性'
关键属性...:rsa2048 rsa2048 rsa2048
此示例显示有3个2048位RSA密钥的空间。 较新的YubiKey支持4096位密钥。 您已准备好使用此信息来生成PGP密钥。
步骤3:生成PGP密钥并添加到YubiKey
大量的教程对此进行了描述。 我不会重复这种努力。 请遵循这份出色的指南。 遵循指南时,请记住以下几点:
- 该指南是针对Linux编写的。 在示例中,将
gpg
替换为gpg2
。 - 记住您的Yubikey支持的密钥大小。 我生成了一个4096位主密钥和2048位子密钥。 出现提示时,请填写正确的值。
- 关于gpg conf文件的位与本示例并不完全相关。 确保生成主密钥,子密钥,并将子密钥移至设备。
- 该指南涵盖了导出,备份密钥以及不将主私钥保留在计算机上的内容。 这个很重要! 本指南假定您使用的是Linux,因此建议您使用LUKS。 这不适用于OSX。 我使用了替代策略。 我将现有的USB笔式驱动器格式化为FAT32。 我使用VeraCrypt([defunkt] TrueCrypt的更新,错误修复和维护的版本)在笔式驱动器上创建了一个新的128MB加密卷。 我将其安装在
~/crypt
并将所有导出文件导出到该目录。 这种方法使我的备份保持加密,并且可以在所有平台上访问(假设所有平台都支持FAT32,而VeraCrypt支持所有平台)。
步骤4:配置GPG代理
您应该已经生成了密钥,对其进行了备份,将子密钥复制到了YubiKey,并将相关位导入了您的笔记本电脑。 您即将准备开始使用这些东西!
这是我遇到另一个绊脚石的地方。 我遵循了指南的加密和解密示例。 使用STDIN中的gpg2 --armor --decrypt
时出现问题。 某个程序正在写入STDOUT,该程序预填充了pinentry
屏幕。 我可以删除重新填充的文本,但是这使我对其他用户感到怀疑。 我还尝试通过keybase
上传新的GPG密钥。 这对于终端的pinentry-curses
根本不起作用。 然后我遇到了pinentry-mac
。 这是一个GUI程序,与终端版本不同,它似乎一直在工作。
GnuPG 2.1引入了另一个不适合较旧指南的更改。 GnuPG 2.1需要GPG代理并自动为您启动它。 无需在外壳配置文件中启动自己的代理进程。 您可以忽略在Internet上找到的与Startig Agent相关的所有内容。 但是,您确实需要导出SSH_AUTH_SOCK
环境变量以与SSH代理一起使用。 您将需要在代理配置文件中更改引脚输入程序。
更新GPG代理配置文件
~/.gnugp/gpg-agent.conf
添加到~/.gnugp/gpg-agent.conf
pinentry程序/ usr / local / bin / pinentry-mac
启用SSH支持
更新您的Shell环境
将以下内容添加到您的Shell配置中。 我用鱼。 这是一个例子:
设置-x GPG_TTY(tty)
设置-x SSH_AUTH_SOCK〜/ .gnupg / S.gpg-agent.ssh
对于几乎所有的壳:
导出“ GPG_TTY = $(tty)”
导出“ SSH_AUTH_SOCK = $ {HOME} /。gnupg / S.gpg-agent.ssh”
现在重新启动任何现有的gpg代理
gpg-connect-agent killagent /再见
gig-connect-agent /再见
第5步:试一试
终于该抽空整个设置了。 您应该通过YubiKey在gpg代理中拥有密钥,并通过gpg代理在SSH代理中拥有密钥。 直接测试SSH访问。 我们将在YubiKey上捕获SSH公钥,并将其添加到GitHub。 您可以为此使用任何远程服务。 我选择GitHub是因为我没有任何正在运行的服务器用于SSH测试。
首先,在YubiKey上捕获SSH公钥。
ssh-add -L | grep -iF'cardno'| pbcopy
现在,公共密钥在剪贴板上。 继续并将其添加到您需要的GitHub(或其他任何地方)。
您还应该从代理中删除现有的SSH,以便测试使用YubiKey上的授权密钥。
ssh -T git@github.com
在GUI中提示时输入您的PIN码。 您应该成功通过GitHub进行身份验证:
嗨ahawkins! 您已成功通过身份验证,但是GitHub不提供Shell访问。
这样可以确保整个工具链都能按预期工作。 现在,您可以继续使用PGP进行其他有趣的事情。
下一步
本指南为您提供足够的帮助。 我建议您调查以下内容:
- 配置
gpg
TTL; 这实际上设置了代理在提示输入PIN /密码之前应等待的时间。 - 在
gpg.conf
文件中设置默认的PGP签名密钥 - Git提交签名
- 将GPG密钥添加到keybase.io。 提示:
keybase pgp select
- 从Keybase获取我的PGP密钥并向我发送加密消息
- 将您的PGP密钥上传到密钥服务器
请注意,使用git commits可能会遇到随机失败的签名。 我不确定为什么会这样。 只需拔下并重新插入YubiKey,似乎就可以解决问题。 有关更多信息,请参见参考文献4。
我希望本指南可以帮助您提高数字安全性。 只要记住要确保YubiKey的安全即可。