原理
用户通过 OpenSSL 工具生成了 RSA 算法的公钥和私钥,然后可以把公钥发给需要免密登录的远程服务器,私钥存储在本地。后续进行登录该远程服务器时,远程服务器会把用户的公钥发送到本地客户端,本地客户端会把接收到的公钥与自己的私钥进行比对,私钥解密成功后就可以无需密码进行访问
一、密钥管理
1.1 密钥的存储
密钥的信息存储在以下任一位置
系统范围的/etc/ssh/ssh_known_hosts 文件。
每个用户的主目录中的~/.ssh/known_hosts 文件。
如果您连接到远程系统,并且该系统的公钥不在/etc/ssh/ssh_known_hosts文件中,则 SSH客户端将在~/.ssh/known hosts 文件中搜索公钥。
1.2 密钥条目介绍
每个已知主机密钥条目包含一行,其中有三个字段:
第一个字段是共享该公钥的主机名和IP 地址的列表。
第二个字段是公钥的加密算法。
最后一个字段是公钥本身。
二、生成公-私密钥对
1.1 生成无密语的密钥对
输入ssh-keygen命令可以生成密钥对,默认会把私钥和和公钥分别存储在~/.ssh/id_rsa和~/.ssh/id_rsa.pub文件中
ssh-keygen
也可以在ssh-keygen后面加-y选项将密钥对存储在指定位置,如下将私钥和和公钥分别存储在~/.ssh/key-with-pass和~/.ssh/key-with-pass.pub文件中
绝对路径为 /home/当前用户名/.ssh/key-with-pass ssh-keygen -f .ssh/key-with-pass
ssh-keygen -f .ssh/key-with-pass
然后一直点回车键直至生成完成,密钥对就生成好了
1.2 生成有密语的密钥对
与无密语密钥对不同的是输入ssh-keygen命令后把回车换成密语,通俗来说就是设置一个密码来保护私钥,每次使用私钥时都必须输入密语,增强了私钥的安全性
三、共享密钥
ssh-copy-id命令可以把本地公钥发送到指定的远程系统,-i选项可以指定特定的公钥文件地址,默认是~/.ssh/id_rsa.pub文件,如果该密钥受密语保护的话,SSH将在第一次请求时输入密语
ssh-copy-id -i .ssh/key-with-pass.pub user@远程系统主机名
四、ssh-agent密钥管理器
如果您使用密语来保护私钥,则每次使用私钥进行身份验证时都必须输入密语。但是,您可以配置ssh-agent 密钥管理器来缓存密语。之后,每次使用 SSH时,ssh-aqent 密钥管理器都会替您提供密语。使用密钥管理器不仅方便,还能减少他人看到您的密语的机会,从而提高安全性。
ssh-agent 密钥管理器可以配置为在您登录时自动启动。GNOME 图形桌面环境可以自动启动和配置ssh-agent 密钥管理器。如果您登录文本环境,则必须针对每个会话手动启动 ssh-agent 程序。使用以下命令来启动 ssh-agent 程序:
eval $(ssh-agent)
然后可以使用ssh-add命令添加私钥
ssh-add 默认从 ~/.ssh/id_rsa 添加私钥
ssh-add .ssh/key-with-pass 从指定位置添加私钥
这样后面在访问远程系统时就不需要输入密语了