一、生成 SSH 公私钥对
可以使用 ssh-keygen
命令来生成 SSH 公私钥对,同时指定使用 RSA 算法。
bash
ssh-keygen -t rsa
-t rsa
:表明使用 RSA 算法生成密钥对。- 执行该命令后,系统会提示你输入密钥保存的位置和密码。若直接回车,则会采用默认值。默认情况下,私钥会保存为
~/.ssh/id_rsa
,公钥会保存为~/.ssh/id_rsa.pub
。
二、SSH 服务配置
- 查看 SSH 服务配置
可以使用以下命令查看 SSH 服务配置中关于公钥认证和密码认证的设置:
bash
grep -E '^PubkeyAuthentication|^PasswordAuthentication' /etc/ssh/sshd_config
- 配置公钥认证和密码认证
要保证 SSH 服务允许公钥认证,若需要,也可开启密码认证作为备用方式。在/etc/ssh/sshd_config
文件中进行如下设置:
plaintext
PubkeyAuthentication yes
PasswordAuthentication yes # 可选,允许密码认证作为备用
设置完成后,重启 SSH 服务,使配置生效:
bash
sudo systemctl restart sshd
三、将公钥复制到目标主机
有两种方法可以将本地生成的公钥内容添加到目标主机的 ~/.ssh/authorized_keys
文件中,如此本地主机就能使用对应的私钥免密登录目标主机。
方法一:使用 ssh-copy-id
命令(前提是目标主机已开启 SSH 服务且允许密码登录)
bash
ssh-copy-id user@target_host
这里的 user
是目标主机的用户名,target_host
是目标主机的 IP 地址或者域名。
方法二:手动复制公钥内容
bash
cat ~/.ssh/id_rsa.pub | ssh user@target_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
该命令借助管道将本地公钥内容通过 SSH 传输到目标主机,并追加到 ~/.ssh/authorized_keys
文件中。
四、免密登录
- 直接使用私钥登录
在本地主机上,使用ssh
命令并指定私钥文件进行登录:
bash
ssh -i ~/.ssh/id_rsa user@target_host
-i
:代表私钥的路径。- 后面依次为用户名和目标主机的 IP 地址或域名。
- 配置 SSH 配置文件(可选)
可以在本地的~/.ssh/config
文件中为目标主机配置别名,以简化登录操作。
plaintext
Host target_alias
HostName target_host
User user
IdentityFile ~/.ssh/id_rsa
target_alias
:为目标主机设置的别名。- 配置完成后,只需使用以下命令即可登录目标主机:
bash
ssh target_alias
五、常见问题及解决办法
密钥认证和密码认证是两种不同的模式,所以即使之后目标用户修改了密码也不会影响密钥认证,但在以下情况下可能会出现认证失败的问题:
- SSH 配置改变:若目标机器将
PubkeyAuthentication
选项设置为no
,则会禁用公钥认证。需要检查并修改/etc/ssh/sshd_config
文件,然后重启 SSH 服务。 - 权限问题:
~/.ssh
目录权限一般应为 700,~/.ssh/authorized_keys
文件权限一般应为 600。可以使用以下命令修改权限:
bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
3 .公钥被修改或者删除:若公钥被修改或者删除,需要重新将本地公钥复制到目标主机的 ~/.ssh/authorized_keys
文件中。