我使用的解决方案比较复杂,但是用途广泛,因为我想在用于我的家庭网络服务器,办公服务器,咨询客户端网络服务器和我使用的其他各种系统的SSH身份密钥中保持一定的分离。
既然如此,我几乎只能在Linux工作站上工作,所以我有一个使用LUKS加密设置的USB密钥,并且我的X11窗口管理器和HAL守护程序一起检测了LUKS加密的驱动器,并在插入并尝试进行解密时提示输入解密密码。被安装。通过以这种方式将其存储在加密驱动器上,我从未将SSH密钥存储在任何工作站上。
然后,我的~/.ssh/config
文件中具有以下配置:
Host *
Protocol 2
IdentityFile %d/.ssh/keys.d/id_rsa.%l
IdentityFile %d/.ssh/keys.d/id_dsa.%l
IdentityFile %d/.ssh/keys.d/%u@%l
将%d通过OpenSSH转换为用户的主目录,并在〜/ .ssh目录中创建了keys.d作为正确安装后的加密USB驱动器上目录路径的符号链接。
在%L表达被转换为本地客户机的主机名和%U将被转换为本地客户端的用户名。
此配置的作用是允许SSH使用3种不同的表达式查找密钥。例如,如果我的本地客户端的用户名是,jdoe
而我的本地客户端计算机的名称是,examplehost
则它将按以下顺序查找,直到找到既存在又被远程服务器接受的密钥。
/home/jdoe/.ssh/keys.d/id_rsa.examplehost
/home/jdoe/.ssh/keys.d/id_dsa.examplehost
/home/jdoe/.ssh/keys.d/jdoe@examplehost
您甚至可以使用%r表达式来查找特定于远程服务器用户名的密钥,或者使用%h来查找远程服务器主机名,就像使用%u和%l一样。
更新:现在,我实际上利用具有ssh-agent兼容性的GnuPG gpg-agent来读取和使用OpenPGP v2智能卡上的身份验证密钥。