保护我的数字生活:macOS上的GPG,Yubikey和SSH

我之前写过有关尝试保护数字生活的文章。 我花了一些时间来研究想法并与他人交谈。 我很清楚,通过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 。 我强烈建议您在继续操作之前先进行更改。 请参阅本优秀指南中的说明。 阅读指南时请牢记以下几点:

  1. 该指南是针对Linux编写的。 在示例中,将gpg替换为gpg2
  2. PIN码必须至少6个字符长。 您可以将其更改为更短的值,但是稍后会破坏情况。
  3. 更改之前,您可能需要“取消阻止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

大量的教程对此进行了描述。 我不会重复这种努力。 请遵循这份出色的指南。 遵循指南时,请记住以下几点:

  1. 该指南是针对Linux编写的。 在示例中,将gpg替换为gpg2
  2. 记住您的Yubikey支持的密钥大小。 我生成了一个4096位主密钥和2048位子密钥。 出现提示时,请填写正确的值。
  3. 关于gpg conf文件的位与本示例并不完全相关。 确保生成主密钥,子密钥,并将子密钥移至设备。
  4. 该指南涵盖了导出,备份密钥以及不将主私钥保留在计算机上的内容。 这个很重要! 本指南假定您使用的是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 
启用S​​SH支持

更新您的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的安全即可。