告别密码!SSH 密钥登录配置,一步解锁高效安全连接

Jayson
2025-12-09 / / 54 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2025年12月09日,已超过44天没有更新,若内容或图片失效,请留言反馈。

SSH 密钥登录指南

一、为什么使用 SSH 密钥登录?

传统密码登录存在两大痛点:

  • 密码容易泄露、被暴力破解(尤其是弱密码)
  • 每次登录需重复输入密码,效率低下(比如频繁连接服务器、推送代码)

而 SSH 密钥登录基于非对称加密算法(公钥 + 私钥),优势明显:

  • ✅ 安全性更高:私钥仅保存在本地,公钥可公开传输,破解难度极大
  • ✅ 免密登录:配置后无需输入密码,直接连接
  • ✅ 多场景适用:服务器(Linux/Windows Server)、代码仓库(Gitea/GitHub/GitLab)、云服务等均支持

二、核心概念:公钥与私钥

  • 私钥(Private Key):相当于「个人身份证」,需妥善保管在本地(如电脑),绝对不能泄露
  • 公钥(Public Key):相当于「身份证复印件」,可上传到服务器、代码平台等目标设备

登录原理:本地用私钥加密验证信息,目标设备用公钥解密,匹配成功则允许登录。

三、分步配置:从生成密钥到登录

前提条件

  • 本地设备:安装 Git(自带 SSH 工具)或单独安装 OpenSSH(Windows 10/11 可通过「设置→应用→可选功能」安装)
  • 目标设备:开启 SSH 服务(服务器默认开启,代码平台无需手动配置)

第一步:生成 SSH 密钥对(本地操作)

  1. 打开终端 / 命令行(Windows 用 Git Bash、PowerShell 均可)
  2. 执行生成命令(推荐 ed25519 算法,安全性更高;若系统不支持,改用 rsa 算法):
# 推荐:ed25519 算法(密钥文件更小、更安全)
ssh-keygen -t ed25519 -C "你的备注信息(如邮箱、设备名)"

# 兼容旧系统:rsa 算法(4096 位加密)
ssh-keygen -t rsa -b 4096 -C "你的备注信息"
  1. 执行后按 3 次回车(无需设置密码,若需更高安全可设置密钥密码):

    • 第一次回车:确认密钥保存路径(默认 ~/.ssh/,Windows 为 C:\Users\你的用户名.ssh\)
    • 第二次 / 第三次回车:跳过设置密钥密码(输入则每次使用密钥需验证密码)
  2. 生成成功后,~/.ssh/ 目录下会出现两个文件:

    • 私钥:id_ed25519(或 id_rsa)→ 本地保管,切勿泄露
    • 公钥:id_ed25519.pub(或 id_rsa.pub)→ 需上传到目标设备

第二步:上传公钥到目标设备(以 2 种常见场景为例)

场景 1:登录 Linux 服务器(如阿里云、腾讯云 EC2)

  1. 查看并复制本地公钥内容:
# Windows/Mac/Linux 通用命令(复制输出的全部内容)
cat ~/.ssh/id_ed25519.pub

输出示例(以 ed25519 为例):

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKZ4k1y8zHxq6jV6Xr+Q9q6G9fW5a7v8e9x3y7z1o2p3q4r5s6t7u8v9w0x your-email@example.com
  1. 上传公钥到服务器(两种方式,选其一):

方式 A:手动上传(适合新手)

① 用密码登录服务器:ssh 用户名@服务器IP(如 ssh root@123.45.67.89

② 在服务器上创建 .ssh 目录(若已存在则跳过):

mkdir -p ~/.ssh && chmod 700 ~/.ssh

③ 编辑 authorized_keys 文件(存储公钥的核心文件):

vi ~/.ssh/authorized_keys

④ 按 i 进入编辑模式,粘贴本地复制的公钥,按 Esc 后输入 :wq 保存退出

⑤ 设置文件权限(关键!否则 SSH 会拒绝读取):

chmod 600 ~/.ssh/authorized_keys

方式 B:一行命令上传(高效)

本地终端执行(无需先登录服务器):

ssh-copy-id -i ~/.ssh/id_ed25519.pub 用户名@服务器IP

按提示输入服务器密码,即可自动完成公钥上传和权限配置。

场景 2:连接 Gitea/GitHub(代码仓库免密推送)

  1. 复制本地公钥内容(同场景 1 第一步)
  2. 登录 Gitea/GitHub,进入密钥配置页:

    • Gitea:右上角头像 → Settings → 左侧 SSH / GPG Keys → Add Key
    • GitHub:右上角头像 → Settings → SSH and GPG keys → New SSH key
  3. 粘贴公钥内容,填写密钥名称(如「我的笔记本」),点击「添加」即可

第三步:测试 SSH 密钥登录

终端执行登录命令(根据场景选择):

  • 服务器:ssh 用户名@服务器IP(如 ssh root@123.45.67.89
  • Gitea:ssh -T git@你的Gitea地址(如 ssh -T git@gitea.example.com
  • GitHub:ssh -T git@github.com

成功标志

  • 服务器:直接登录到命令行,无需输入密码
  • Gitea/GitHub:提示 Hi 你的用户名! You've successfully authenticated...

四、进阶优化:提升安全性与便捷性

1. 禁用服务器密码登录(推荐)

配置密钥登录后,禁用密码登录可彻底防止暴力破解:

  1. 登录服务器,编辑 SSH 配置文件:

    vi /etc/ssh/sshd_config
  2. 修改以下参数(去掉注释并设置为对应值):

    PasswordAuthentication no  # 禁用密码登录
    PubkeyAuthentication yes   # 启用公钥登录
    PermitRootLogin prohibit-password  # 禁止 root 密码登录(仅允许密钥)
  3. 重启 SSH 服务生效:

    # Ubuntu/Debian
    sudo systemctl restart sshd
    
    # CentOS/RHEL
    sudo systemctl restart sshd
    
    # 旧系统(如 CentOS 6)
    sudo service sshd restart

2. 配置别名登录(避免记忆 IP / 用户名)

每次输入 ssh root@123.45.67.89 麻烦?可配置别名:

  1. 本地编辑 SSH 配置文件:

    vi ~/.ssh/config
  2. 添加以下内容(按需修改):

    # 服务器别名配置(示例)
    Host my-server  # 别名(可自定义,如 server1、aliyun)
      HostName 123.45.67.89  # 服务器 IP 或域名
      User root  # 登录用户名
      IdentityFile ~/.ssh/id_ed25519  # 私钥路径(默认可省略)
    
    # Gitea 别名(可选)
    Host my-gitea
      HostName gitea.example.com
      User git
      IdentityFile ~/.ssh/id_ed25519
  3. 保存后,直接用别名登录:

    ssh my-server  # 等价于 ssh root@123.45.67.89

五、常见问题排查

1. 登录提示「Permission denied (publickey)」

可能原因及解决方案:

  • 原因 1:公钥未正确上传到目标设备的 authorized_keys 文件

    • 解决:重新上传公钥,确保内容完整(无多余空格、换行)
  • 原因 2:服务器 ~/.ssh 或 authorized_keys 权限过高

    • 解决:重新设置权限(参考场景 1 步骤 2 方式 A 第 5 步)
  • 原因 3:私钥路径错误或权限过高(本地)

    • 解决:私钥权限需设为 600:chmod 600 ~/.ssh/id_ed25519

2. Windows 提示「ssh: command not found」

  • 解决:安装 Git(自带 SSH 工具),或在「设置→应用→可选功能」中安装「OpenSSH 客户端」

3. 密钥丢失 / 泄露怎么办?

  • 私钥泄露:立即删除目标设备(服务器、Gitea 等)上对应的公钥,重新生成新的密钥对并上传
  • 私钥丢失:无法恢复,重新生成密钥对并上传公钥到目标设备
0