ssh-keygen 超全详解:告别密码登录,实现SSH免密登录

16次阅读
没有评论

玩服务器、Git、Linux 开发的小伙伴,一定对 SSH 登录不陌生。每次远程连接服务器都输入密码,不仅麻烦,还存在密码泄露、暴力破解的安全风险。

ssh-keygen 就是解决这个问题的核心工具!它是 SSH 协议的密钥生成工具,一键生成公私钥对,实现服务器、Git 仓库的免密登录,同时大幅提升远程连接的安全性。

今天这篇博文,从零带你吃透 ssh-keygen,包含原理、常用命令、实操步骤、避坑技巧,新手也能直接上手!


一、什么是 ssh-keygen?核心原理科普

ssh-keygen 是 OpenSSH 自带的密钥生成命令,无需额外安装,Linux、Mac、Windows 10+ 系统原生支持。

它的核心作用是 生成非对称加密密钥对,包含两个文件:

  • 私钥(id_xxx):相当于你的「私人钥匙」,绝对不能泄露、不能外传,保存在本地电脑
  • 公钥(id_xxx.pub):相当于「锁」,可以公开分发,上传到服务器/Git 仓库

免密登录原理

本地持有私钥,远程服务器存储你的公钥。连接时,双方通过密钥加密校验,匹配成功即可直接登录,无需输入密码,安全又高效。


二、默认密钥生成(零基础快速上手)

最简单的用法,直接在终端输入命令,全程回车默认配置,适合绝大多数场景:

ssh-keygen

执行后会出现 3 次交互提问,直接回车全部默认即可:

1. 密钥存储路径

默认路径:~/.ssh/id_rsa,无需修改,回车跳过

2. 密钥密码(重点)

可设置密钥独立密码(区别于服务器登录密码),日常本地使用直接回车留空,实现真正免密;如果是多人共用设备,建议设置密码提升安全性。

3. 确认密码

再次回车确认,等待 1 秒即可生成完成。

生成成功后,~/.ssh 目录会出现两个核心文件

  • id_rsa:私钥(权限 600,系统自动保护)
  • id_rsa.pub:公钥(可公开)

三、ssh-keygen 高频实用参数(进阶必备)

默认命令满足基础需求,工作中我们常需要自定义密钥类型、备注、有效期,以下参数是高频刚需,建议收藏!

1. -t:指定加密算法(最常用)

默认生成 RSA 算法密钥,推荐使用更安全的 ed25519 算法(安全性更高、密钥更短、速度更快):

# 生成 ed25519 安全密钥(推荐!)
ssh-keygen -t ed25519

# 传统 RSA 密钥(兼容老旧服务器)
ssh-keygen -t rsa

2. -C:添加密钥备注(区分多账号)

一台电脑配置多个 Git 账号、多台服务器时,备注可以精准区分密钥归属,格式一般用邮箱:

ssh-keygen -t ed25519 -C "your@email.com"

3. -f:自定义密钥存储路径/文件名

避免默认密钥覆盖,自定义密钥名称,适配多密钥场景:

# 生成命名为 server-key 的密钥对
ssh-keygen -t ed25519 -C "server@test.com" -f ~/.ssh/server-key

4. -N:免交互设置密钥密码

适合脚本自动化部署,无需手动回车输入密码:

# 设置密钥密码为 123456(生产环境不建议明文)
ssh-keygen -t ed25519 -N "123456"

5. -R:清除旧密钥缓存(解决连接报错)

服务器重装、IP 复用后,本地缓存的旧密钥会导致 Host key verification failed 报错,执行以下命令清除缓存即可:

ssh-keygen -R 服务器IP/域名

四、实操:实现服务器 SSH 免密登录

生成密钥对后,只需把 公钥 上传到远程服务器,即可实现免密登录,两种方式任选其一:

方式 1:一键自动上传(简单高效)

ssh-copy-id 用户名@服务器IP

执行后输入一次服务器密码,系统会自动将公钥写入服务器 ~/.ssh/authorized_keys 文件,配置完成。

方式 2:手动配置(适配无 ssh-copy-id 环境)

  1. 本地查看并复制公钥内容:cat ~/.ssh/id_ed25519.pub
  2. 登录远程服务器,创建密钥目录:mkdir -p ~/.ssh
  3. 将复制的公钥内容写入授权文件:echo "公钥内容" >> ~/.ssh/authorized_keys
  4. 设置权限(必须配置,否则免密失效): chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys

配置完成后,再次 SSH 连接服务器,无需输入密码,直接登录成功!


五、常见问题 & 避坑指南

1. 免密配置完成后仍然需要输入密码?

90% 是 文件权限错误 导致的!SSH 对密钥文件权限极其严格,必须执行权限命令:

# 本地权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519

# 服务器端权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

2. 提示 Host key verification failed

服务器密钥变更,本地缓存未更新,执行清除命令:ssh-keygen -R 服务器IP,重新连接即可。

3. 多密钥冲突,默认不调用指定密钥?

自定义密钥后,通过 config 文件指定对应服务器使用的密钥,在本地 ~/.ssh/config 配置:

Host 自定义别名
  HostName 服务器IP
  User 用户名
  IdentityFile ~/.ssh/自定义私钥路径

六、总结

ssh-keygen 是运维、开发必备的基础工具,核心价值就是 安全、高效、自动化

  • 替代密码登录,杜绝暴力破解风险
  • 适配服务器远程连接、Github/Gitee 免密拉推代码
  • 支持自动化部署、脚本批量运维

日常使用优先推荐 ssh-keygen -t ed25519 -C "备注" 命令,兼顾安全性和兼容性,一次配置、永久受用!

正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)
验证码