ssh-keygen命令

ssh-keygen 命令 #

ssh-keygen是一个用于创建、管理和转换SSH密钥的工具。SSH密钥用于安全地自动登录到远程系统,而无需每次都输入密码。

语法 #

ssh-keygen [选项]

常用选项 #

选项 描述
-t 类型 指定要创建的密钥类型(rsa、dsa、ecdsa、ed25519)
-b 位数 指定密钥长度(位)
-f 文件名 指定密钥文件名
-C 注释 添加注释(通常是邮箱地址)
-N 密码 提供新密码
-p 更改私钥文件的密码
-y 从私钥文件中读取并输出公钥
-R 主机名 从known_hosts文件中删除指定主机的所有密钥
-l 显示公钥文件的指纹
-E 指纹类型 指定指纹的哈希算法(md5、sha256)
-i 从PKCS#8私钥或RFC4716公钥转换为OpenSSH格式
-e 从OpenSSH密钥转换为RFC4716/PKCS#8格式
-q 安静模式
-v 详细模式

常见用法 #

1. 生成默认SSH密钥对 #

ssh-keygen

这将在~/.ssh/目录下创建id_rsa(私钥)和id_rsa.pub(公钥)文件。

2. 生成指定类型和长度的密钥 #

ssh-keygen -t rsa -b 4096

这将生成4096位的RSA密钥对。

3. 生成ED25519密钥(更安全、更短) #

ssh-keygen -t ed25519

4. 生成带有注释的密钥 #

ssh-keygen -t rsa -b 4096 -C "[email protected]"

5. 指定密钥文件名 #

ssh-keygen -t rsa -b 4096 -f ~/.ssh/github_key

这将创建github_key(私钥)和github_key.pub(公钥)文件。

6. 更改私钥密码 #

ssh-keygen -p -f ~/.ssh/id_rsa

7. 从私钥生成公钥 #

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub

8. 显示密钥指纹 #

ssh-keygen -l -f ~/.ssh/id_rsa.pub

9. 使用SHA256显示指纹 #

ssh-keygen -l -E sha256 -f ~/.ssh/id_rsa.pub

10. 使用MD5显示指纹 #

ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub

11. 从known_hosts中删除主机 #

ssh-keygen -R hostname

密钥类型比较 #

类型 安全性 兼容性 推荐位数 备注
RSA 高(足够位数) 最广泛 3072或4096 最通用的选择
DSA 1024(固定) 不推荐使用,安全性问题
ECDSA 256, 384, 521 椭圆曲线算法,较短密钥
ED25519 非常高 较新系统 256(固定) 最安全,密钥短,较新

实用示例 #

1. 为不同服务创建不同的密钥 #

ssh-keygen -t rsa -b 4096 -f ~/.ssh/github_key -C "github"
ssh-keygen -t rsa -b 4096 -f ~/.ssh/gitlab_key -C "gitlab"
ssh-keygen -t ed25519 -f ~/.ssh/server_key -C "production server"

2. 生成不带密码的密钥(适用于自动化) #

ssh-keygen -t rsa -b 4096 -f ~/.ssh/automation_key -N ""

注意:无密码的密钥存在安全风险,仅在必要时使用。

3. 检查公钥格式 #

ssh-keygen -l -f ~/.ssh/id_rsa.pub

输出示例:

3072 SHA256:abcdefghijklmnopqrstuvwxyz1234567890ABCDEFG [email protected] (RSA)

4. 转换密钥格式 #

从OpenSSH转换为RFC4716格式:

ssh-keygen -e -f ~/.ssh/id_rsa.pub > ~/.ssh/id_rsa_rfc.pub

从RFC4716转换为OpenSSH格式:

ssh-keygen -i -f ~/.ssh/id_rsa_rfc.pub > ~/.ssh/id_rsa_openssh.pub

5. 创建证书 #

ssh-keygen -s ca_key -I certificate_id -n user1,user2 id_rsa.pub

这将使用CA密钥签署公钥,创建证书。

配置SSH客户端使用特定密钥 #

~/.ssh/config文件中添加:

Host github.com
    IdentityFile ~/.ssh/github_key
    User git

Host example.com
    IdentityFile ~/.ssh/server_key
    User admin

安全最佳实践 #

  1. 使用强密码保护私钥
  2. 对不同服务使用不同的密钥对
  3. 定期轮换密钥
  4. 使用至少3072位的RSA密钥或ED25519密钥
  5. 限制私钥文件的权限:chmod 600 ~/.ssh/id_rsa
  6. 考虑使用ssh-agent管理密钥
  7. 在服务器上定期审核authorized_keys文件
  8. 使用密钥认证时禁用密码认证

与其他SSH工具的结合 #

使用ssh-copy-id部署公钥 #

ssh-copy-id -i ~/.ssh/id_rsa.pub user@hostname

使用ssh-agent管理密钥 #

eval $(ssh-agent)
ssh-add ~/.ssh/id_rsa

使用ssh-keyscan获取主机密钥 #

ssh-keyscan hostname >> ~/.ssh/known_hosts

常见问题排查 #

权限问题 #

如果遇到"Permissions too open"错误:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub

密钥格式问题 #

如果密钥不被接受,检查格式:

ssh-keygen -l -f ~/.ssh/id_rsa.pub

密钥类型兼容性 #

如果服务器不支持较新的密钥类型(如ED25519),尝试使用RSA:

ssh-keygen -t rsa -b 4096

提示 #

  • 使用-C选项添加注释可以帮助识别不同的密钥
  • 使用ssh-agent可以避免重复输入密钥密码
  • 对于自动化任务,可以使用无密码的密钥,但要确保私钥安全
  • 使用ssh-keygen -R hostname可以快速解决"REMOTE HOST IDENTIFICATION HAS CHANGED"错误
  • 使用ssh-keygen -y可以从私钥重新生成丢失的公钥
  • 在企业环境中,考虑使用SSH证书而不是单独管理每个主机的authorized_keys