- 所有文章/
在 macOS 上使用 Canokey 的 OpenPGP 应用
本文目录
准备 #
在开始前,确保已经在 macOS 上安装好 Homebrew
pinentry-mac 是 macOS 下 GPG 应用的 Pinentry 实现
brew install git\
openssh \
gnupg \
vim \
pinentry-mac
配置 Git 信息 #
# 验证 Git 安装
git --version
# 配置 Git 用户信息,注意替换成你自己的
git config --global user.name "DejavuMoe"
git config --global user.email "im@dejavu.moe"
设置签名密钥 #
导入自己的公钥,这里以我在 GitHub 的公钥为例
# 导入公钥
curl https://github.com/DejavuMoe.gpg | gpg --import
# 信任密钥
gpg --expert --edit-key admin@dejavu.moe
# 输入 trust 命令选择信任等级
gpg> trust
请决定您对这名用户能否正确地验证其他用户密钥
(通过查看护照,检查不同来源的的指纹等等)的相信程度
1 = 我不知道或不作答
2 = 我不相信
3 = 我勉强相信
4 = 我完全相信
5 = 我绝对相信
m = 回到主菜单
您的决定是什么? 5
您真的要把这个密钥设置成绝对信任?(y/N) y
现在可以将存有私钥信息的 Canokey/Yubikey 插入 Mac 了
# 查看智能卡状态
gpg --card-status
# 编辑智能卡
gpg --card-edit
# 将子密钥指向 Canokey
gpg/card> fetch
# 退出
gpg/card> quit
接下来设置用于签名的 OpenPGP 子密钥
gpg --card-status
# 找到用于签名应用的子密钥 ID,比如 ed25519/AC65D1D723ABCD64
# 设置用于签名的子密钥 ID
git config --global user.signingkey ed25519/AC65D1D723ABCD64
# 全局开启 Git 签名要求
git config --global commit.gpgsign true
设置 SSH #
看一下 pinentry-mac 的安装路径
which pinentry-mac
/opt/homebrew/bin/pinentry-mac
编辑 gpg agent 启动的配置文件
vim ~/.gnupg/gpg-agent.conf
写入以下内容保存
pinentry-program /opt/homebrew/bin/pinentry-mac
enable-ssh-support
default-cache-ttl 600
max-cache-ttl 7200
查看各密钥 Keygrip,实际上我们只需要用于 SSH 访问功能是身份认证 [A] 的子密钥就好了
gpg -K --with-keygrip
# 找到标记 [A] 为身份认证的子密钥的 Keygrip
ssb> ed25519 2022-01-08 [A] [有效至:2042-06-04]
Keygrip = 653FADC5EAB512345E196A3D8C419CAFCF637B09
# 将 Keygrip 写入 sshcontrol 文件
echo 653FADC5EAB512345E196A3D8C419CAFCF637B09 >> ~/.gnupg/sshcontrol
将下面内容写入你默认 Shell 的配置文件里(.bashprofile
或 .zshrc
),我是 zsh
+ oh-my-zsh
的组合,所以写进 .zshrc
文件里
export GPG_TTY=$(tty)
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
gpgconf --launch gpg-agent
让配置文件生效
source ~/.zshrc
gpg-connect-agent killagent /bye
gpg-connect-agent /bye
gpg --card-status
ssh-add -l
# 导出 SSH 公钥格式
gpg --export-ssh-key [keyID]
尝试登陆 #
将导出的 SSH 格式公钥添加到 GitHub(或其他需要登录的服务器),尝试登陆
ssh -T git@github.com
Hi DejavuMoe! You've successfully authenticated, but GitHub does not provide shell access.
尝试给 Git 提交签名,这时候应该会正常出现 Pinentry 的窗口了
完成,Enjoy!
参考资料: