在Termux 里使用GPG密钥登录ssh服务器
使用场景
现在我有了一部安卓设备,我需要使用它在任何时候登录我的服务器,而我的服务器仅支持使用公钥访问。
目前我暂时不清楚有哪些应用支持使用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
如果不想全用一个用户名就挨个写两条。
每次登录都需要输入密码解锁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文件末尾添加。
我直接买了个canokey存canokey里了(doge)