使用场景

现在我有了一部安卓设备,我需要使用它在任何时候登录我的服务器,而我的服务器仅支持使用公钥访问
目前我暂时不清楚有哪些应用支持使用GPG密钥替代密码认证登录SSH,所以直接使用Termux模拟的Linux Shell环境就了最佳选择。

安装依赖

pkg update && pkg upgrade
pkg install gnupg openssh util-linux
其他操作系统自行使用各自的包管理器安装,这些包在绝大多数桌面发行版默认安装。

导入密钥

理论上,安全起见我们应该只导入用于验证的私钥部分,将认证密钥和主密钥分离开分权管理。但是我是个懒人,另外考虑到国产手机+国产定制系统=面向政府透明,
且《中华人民共和国刑事诉讼法》:

第七十四条规定:有关单位和公民对侦查机关的调查,应当如实提供情况,不得有隐瞒、拒绝、妨碍的行为。对有关人员的传唤、讯问和取证,应当予以配合。
第九十三条规定:公民有义务协助调查人员调查犯罪,提供与案件有关的情况和线索。
所以无论何如加密,除非使用便于快速摧毁的硬件设备或拒不配合提供密钥及解密密码,否则是无法彻底保障密钥安全性的。(当然除非真的涉及违法,我们还是可以通过GPG和E2EE合法保障自身通信隐私的。)这时候分离密钥也就意义不大了。
gpg --import all_keys.asc

为gpg-agent启用ssh支持

echo "enable-ssh-support" >> ~/.gnupg/gpg-agent.conf

启动gpg-agent服务

gpg-agent --daemon 

指定使用gpg-agent作为SSH验证代理

echo "export SSH_AUTH_SOCK=\$(gpgconf --list-dirs agent-ssh-socket)" >> ~/.bashrc
source ~/.bashrc

指定用于SSH认证的key

如果你不知道keygrip ,参见:[查看具有[A]即标示的子密钥(ssb)的keygrip][3]

echo "EF21ED9472AA44F7CC0D337F29540E2D97D154C7" >> .gnupg/sshcontrol

更新gpg-agent配置

gpg-connect-agent updatestartuptty /bye

至此我们已经大功告成。

细节修缮

修改Termux用户名 (ROOT User)

当我以为一切已经完成,ssh xfox.fun发现还是不能直接登录,因为Termux 的默认用户名和我平时登录ssh的可不一样。
输入whoami,终端回显了一个奇怪的用户名,显然需要将这一用户修改成自己常用的用户名。
这就是为什么我要安装 util-linux 。
usermod -l new_name old_name
重新启动Termux,ssh yourserver.com

没有root怎么办?

nano ~/.ssh/config
写入如下内容

Host *
User YourUserName
#如果不想全用一个用户名就挨个写两条。
#如果你还希望 配置 ~/.ssh/config 强制使用 gpg-agent
IdentityFile /dev/null #确保不使用普通的 SSH 密钥文件。
IdentityAgent $SSH_AUTH_SOCK #指定 gpg-agent 作为代理。

每次登录都需要输入密码解锁GPG私钥?

echo -e "default-cache-ttl 0\nmax-cache-ttl 0" >> ~/.gnupg/gpg-agent.conf

设置后开机仍然提示Permission denied (publickey).

是gpg-agent服务没有启动导致的
在 /etc/profile 添加如下内容

启动gpg-agent服务

gpg-agent --daemon
如果只使用当前用户启动,也可以直接在~/.bashrc文件末尾添加。

标签: none

仅有一条评论

  1. 我直接买了个canokey存canokey里了(doge)

添加新评论