在使用 SSH(Secure Shell)进行远程登录时,指定使用公钥-私钥对的方式进行认证,可以提高安全性并避免输入密码。以下是配置和使用 SSH 公钥-私钥对的步骤:
1. 生成 SSH 密钥对
如果你还没有 SSH 密钥对,可以使用 ssh-keygen
命令生成:
ssh-keygen -t rsa -b 2048
这个命令会生成一个 2048 位的 RSA 密钥对,包括一个私钥(默认为 ~/.ssh/id_rsa
)和一个公钥(默认为 ~/.ssh/id_rsa.pub
)。
我这里已经有了就不生成了。
2. 复制公钥到远程服务器
使用 ssh-copy-id
命令将你的公钥复制到远程服务器的 ~/.ssh/authorized_keys
文件中。这个命令会自动创建 .ssh
目录和 authorized_keys
文件(如果它们不存在),并设置适当的权限:
ssh-copy-id -i ~/.ssh/id_rsa.pub username@remote_host
这里 username
是你的远程服务器用户名,remote_host
是远程服务器的地址。
如:
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.1
上传成功之后,服务端可以看到.ssh
目录。
~/.ssh/authorized_keys
存储的就是你的公钥。
配置完成之后,ssh登录不再需要输入密码。
3. 手动设置公钥(可选)
如果没有 ssh-copy-id
命令,你可以手动将公钥复制到远程服务器:
cat ~/.ssh/id_rsa.pub | ssh username@remote_host 'mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys'
4. 配置 SSH 客户端(可选)
在本地 SSH 客户端的配置文件 ~/.ssh/config
中,你可以指定使用特定的私钥文件:
Host remote_host
HostName remote_host
User username
IdentityFile ~/.ssh/id_rsa
这里 remote_host
是远程服务器的地址,username
是你的远程服务器用户名,IdentityFile
指定了私钥文件的路径。
如果你默认只有一对公私钥,任何ssh服务的认证都使用这对公私钥,不需要做这个配置,SSH 客户端会自动使用 ~/.ssh/id_rsa
作为默认的私钥文件进行认证,只要远程服务器上的 ~/.ssh/authorized_keys
文件中包含了对应的公钥。但是这样做可能会有安全风险,一旦丢失、泄漏或者被篡改意味着所有的ssh认证都会出现无法认证或被恶意登录的问题。
ssh的-i参数:
-i
代表 identity file,即身份文件,~/.ssh/id_rsa
是私钥文件的路径。
-i ~/.ssh/id_rsa
:这个选项指定了用于认证的私钥文件。
5. 登录到远程服务器
现在,当你使用 SSH 登录到远程服务器时,SSH 客户端会自动使用指定的私钥进行认证:
ssh username@remote_host
如果一切配置正确,你将无需输入密码即可登录。
注意事项
- 确保私钥文件的权限设置为只有所有者可以读取(
chmod 600 ~/.ssh/id_rsa
)。 - 确保远程服务器上的
.ssh
目录和authorized_keys
文件的权限正确(.ssh
目录权限为700
,authorized_keys
文件权限为600
)。 - 如果你的 SSH 服务配置了不允许密码登录(
PasswordAuthentication no
),则必须使用密钥认证或其他认证方法。 - 如果你使用的是 SSH 代理(
ssh-agent
),确保私钥已经添加到代理中,这样 SSH 客户端就可以自动使用它进行认证。