SSH 密钥登录指南
一、为什么使用 SSH 密钥登录?
传统密码登录存在两大痛点:
- 密码容易泄露、被暴力破解(尤其是弱密码)
- 每次登录需重复输入密码,效率低下(比如频繁连接服务器、推送代码)
而 SSH 密钥登录基于非对称加密算法(公钥 + 私钥),优势明显:
- ✅ 安全性更高:私钥仅保存在本地,公钥可公开传输,破解难度极大
- ✅ 免密登录:配置后无需输入密码,直接连接
- ✅ 多场景适用:服务器(Linux/Windows Server)、代码仓库(Gitea/GitHub/GitLab)、云服务等均支持
二、核心概念:公钥与私钥
- 私钥(Private Key):相当于「个人身份证」,需妥善保管在本地(如电脑),绝对不能泄露
- 公钥(Public Key):相当于「身份证复印件」,可上传到服务器、代码平台等目标设备
登录原理:本地用私钥加密验证信息,目标设备用公钥解密,匹配成功则允许登录。
三、分步配置:从生成密钥到登录
前提条件
- 本地设备:安装 Git(自带 SSH 工具)或单独安装 OpenSSH(Windows 10/11 可通过「设置→应用→可选功能」安装)
- 目标设备:开启 SSH 服务(服务器默认开启,代码平台无需手动配置)
第一步:生成 SSH 密钥对(本地操作)
- 打开终端 / 命令行(Windows 用 Git Bash、PowerShell 均可)
- 执行生成命令(推荐 ed25519 算法,安全性更高;若系统不支持,改用 rsa 算法):
# 推荐:ed25519 算法(密钥文件更小、更安全)
ssh-keygen -t ed25519 -C "你的备注信息(如邮箱、设备名)"
# 兼容旧系统:rsa 算法(4096 位加密)
ssh-keygen -t rsa -b 4096 -C "你的备注信息"执行后按 3 次回车(无需设置密码,若需更高安全可设置密钥密码):
- 第一次回车:确认密钥保存路径(默认 ~/.ssh/,Windows 为 C:\Users\你的用户名.ssh\)
- 第二次 / 第三次回车:跳过设置密钥密码(输入则每次使用密钥需验证密码)
生成成功后,~/.ssh/ 目录下会出现两个文件:
- 私钥:
id_ed25519(或id_rsa)→ 本地保管,切勿泄露 - 公钥:
id_ed25519.pub(或id_rsa.pub)→ 需上传到目标设备
- 私钥:
第二步:上传公钥到目标设备(以 2 种常见场景为例)
场景 1:登录 Linux 服务器(如阿里云、腾讯云 EC2)
- 查看并复制本地公钥内容:
# Windows/Mac/Linux 通用命令(复制输出的全部内容)
cat ~/.ssh/id_ed25519.pub输出示例(以 ed25519 为例):
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKZ4k1y8zHxq6jV6Xr+Q9q6G9fW5a7v8e9x3y7z1o2p3q4r5s6t7u8v9w0x your-email@example.com- 上传公钥到服务器(两种方式,选其一):
方式 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 第一步)
登录 Gitea/GitHub,进入密钥配置页:
- Gitea:右上角头像 → Settings → 左侧 SSH / GPG Keys → Add Key
- GitHub:右上角头像 → Settings → SSH and GPG keys → New SSH key
- 粘贴公钥内容,填写密钥名称(如「我的笔记本」),点击「添加」即可
第三步:测试 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. 禁用服务器密码登录(推荐)
配置密钥登录后,禁用密码登录可彻底防止暴力破解:
登录服务器,编辑 SSH 配置文件:
vi /etc/ssh/sshd_config修改以下参数(去掉注释并设置为对应值):
PasswordAuthentication no # 禁用密码登录 PubkeyAuthentication yes # 启用公钥登录 PermitRootLogin prohibit-password # 禁止 root 密码登录(仅允许密钥)重启 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 麻烦?可配置别名:
本地编辑 SSH 配置文件:
vi ~/.ssh/config添加以下内容(按需修改):
# 服务器别名配置(示例) 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保存后,直接用别名登录:
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
- 解决:私钥权限需设为 600:
2. Windows 提示「ssh: command not found」
- 解决:安装 Git(自带 SSH 工具),或在「设置→应用→可选功能」中安装「OpenSSH 客户端」
3. 密钥丢失 / 泄露怎么办?
- 私钥泄露:立即删除目标设备(服务器、Gitea 等)上对应的公钥,重新生成新的密钥对并上传
- 私钥丢失:无法恢复,重新生成密钥对并上传公钥到目标设备