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
安全最佳实践 #
- 使用强密码保护私钥
- 对不同服务使用不同的密钥对
- 定期轮换密钥
- 使用至少3072位的RSA密钥或ED25519密钥
- 限制私钥文件的权限:
chmod 600 ~/.ssh/id_rsa
- 考虑使用ssh-agent管理密钥
- 在服务器上定期审核authorized_keys文件
- 使用密钥认证时禁用密码认证
与其他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