ssh服务公私钥认证


在使用 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 目录权限为 700authorized_keys 文件权限为 600)。
  • 如果你的 SSH 服务配置了不允许密码登录(PasswordAuthentication no),则必须使用密钥认证或其他认证方法。
  • 如果你使用的是 SSH 代理(ssh-agent),确保私钥已经添加到代理中,这样 SSH 客户端就可以自动使用它进行认证。

文章作者: 司晓凯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 司晓凯 !
  目录