为什么要使用SSH密钥登录(免密登录)

在Linux服务器管理中,SSH(Secure Shell)是远程连接的常用工具。传统的密码登录虽然简单,但存在密码容易被暴力破解的风险。而SSH密钥登录(免密登录) 通过非对称加密的方式,安全性更高,且无需每次输入密码,使用更便捷。

准备工作

  • 客户端:本地电脑(Windows/Linux/macOS),需安装SSH客户端(Linux/macOS默认自带,Windows需安装Git Bash或PuTTY等工具)。
  • 服务器:目标Linux服务器(如CentOS、Ubuntu等),需确保已安装SSH服务(通常默认安装,可通过 ssh -V 检查)。

步骤1:生成SSH密钥对(客户端)

在本地客户端生成一对密钥:私钥(仅本地保存,用于身份验证)和公钥(需上传到服务器)。

  1. 打开本地终端(Linux/macOS直接用Terminal,Windows用Git Bash),执行命令:
   ssh-keygen -t rsa -b 4096
  • -t rsa:指定密钥类型为RSA。
  • -b 4096:密钥长度(4096位更安全,也可省略,默认2048位)。
  1. 按提示操作:
    - 询问“Enter file in which to save the key”时,直接回车(默认保存到 ~/.ssh/id_rsa~ 表示用户家目录)。
    - 询问“Enter passphrase”时,可留空(否则每次连接需输入私钥密码,建议初学者留空,后续用密码更方便)。

  2. 生成成功后,会在 ~/.ssh 目录下生成两个文件:
    - id_rsa私钥(需严格保密,权限建议设为600)。
    - id_rsa.pub公钥(可公开,用于上传到服务器)。

步骤2:将公钥复制到服务器

需将客户端的公钥内容上传到服务器的 ~/.ssh/authorized_keys 文件中(服务器用该文件存储允许登录的公钥)。

情况1:客户端为Linux/macOS(推荐,自动操作)

执行以下命令(替换 用户名服务器IP):

ssh-copy-id -i ~/.ssh/id_rsa.pub 用户名@服务器IP
  • -i:指定公钥文件路径(默认 ~/.ssh/id_rsa.pub)。
  • 输入服务器密码后,公钥会自动复制到服务器的 ~/.ssh/authorized_keys,并自动设置权限。

情况2:客户端为Windows(手动复制)

  1. 打开本地公钥文件 id_rsa.pub(用记事本或文本编辑器打开),复制全部内容。
  2. 登录服务器(通过密码),在终端执行:
   mkdir -p ~/.ssh  # 创建.ssh目录(若不存在)
   cd ~/.ssh
   echo "公钥内容" >> authorized_keys  # 粘贴刚才复制的公钥
   chmod 600 authorized_keys  # 设置公钥文件权限(关键!否则SSH无法读取)
   chmod 700 ~/.ssh  # 设置.ssh目录权限(避免被其他用户修改)

步骤3:服务器端配置(确保允许密钥登录)

需确保服务器的SSH服务(sshd)允许公钥登录,并禁用密码登录(可选)。

  1. 编辑SSH配置文件 sshd_config
   sudo vim /etc/ssh/sshd_config
  1. 检查/修改以下关键选项(确保未被注释,且值为 yes):
    - PubkeyAuthentication yes:允许公钥认证(默认开启)。
    - AuthorizedKeysFile .ssh/authorized_keys:指定公钥文件路径(默认值正确,无需修改)。
    - 若需禁用密码登录(仅用密钥登录),修改:PasswordAuthentication no(建议先保留 yes,确保密码登录可用,后续再改)。

  2. 保存文件并重启SSH服务:

   sudo systemctl restart sshd  # CentOS/RHEL
   # 或
   sudo systemctl restart ssh  # Ubuntu/Debian

步骤4:客户端连接测试(免密登录)

配置完成后,本地客户端无需密码即可连接服务器:

  1. 直接执行连接命令:
   ssh 用户名@服务器IP
  • 首次连接时,会提示“Are you sure you want to continue connecting (yes/no)?”,输入 yes 确认。
  • 无需再输入密码,直接登录成功!

常见问题及解决方法

  1. 权限错误
    - 服务器端 authorized_keys 权限应为 600chmod 600 ~/.ssh/authorized_keys),否则报错“Permission denied”。
    - 客户端私钥 id_rsa 权限应为 600chmod 600 ~/.ssh/id_rsa),否则SSH会提示“Bad permissions on private key file”。

  2. 连接时仍需密码
    - 检查服务器端 sshd_configPubkeyAuthentication 是否为 yes
    - 确认公钥已正确复制到 authorized_keys,且内容无多余空格/换行。

  3. 忘记私钥密码
    - 若生成密钥时设置了密码,需在连接时输入;若未设置(步骤1留空),则无密码。
    - 若需重置密钥,删除 ~/.ssh/id_rsaid_rsa.pub,重新执行步骤1生成。

总结

通过SSH密钥登录,既避免了密码泄露风险,又简化了登录流程。核心是“生成密钥对→上传公钥到服务器→配置服务器允许公钥登录”,重点注意文件权限和配置文件正确性。建议先在本地练习,再逐步迁移到生产环境。

提示:若需完全禁用密码登录,可在 sshd_config 中设 PasswordAuthentication no,并重启SSH服务。

小夜