返回首页

SSH 密钥目录全解 — ~/.ssh 各文件职责与权限

📅 创建于 2026-08-31 🔄 更新于 2026-08-31 📝 433 字

SSH 密钥目录全解 — ~/.ssh 各文件职责与权限

来源:微信公众号「Python运维实践」《一文读懂 ~/.ssh:私钥、公钥、known_hosts 到底各管什么》

定位:用 SSH 登录、配免密、传文件都离不开 ~/.ssh,但目录里一堆文件——id_ed25519、id_ed25519.pub、authorized_keys、known_hosts、config——到底各管什么?哪个能公开、哪个必须保密、权限设多少?照本文执行即可,无需回忆。

一句话结论

  • 私钥(id_ed25519)=你证明「我是我」的凭证,必须藏好,绝不能外泄
  • 公钥(id_ed25519.pub)=发给对方、贴在门锁上的「钥匙孔」,可以公开
  • authorized_keys=服务器上「允许进门」的公钥名单
  • known_hosts=你「认识」过的服务器身份证,用来防止中间人冒充
  • config=给每台主机写的「快捷方式」和默认参数

关键排查直觉: 把文件复制到新电脑、恢复备份或更改了属主之后,SSH 突然不再接受密钥——先检查这个目录(尤其是权限),往往一步定位。

目录位置

~/.ssh 位于主目录内,OpenSSH 需要时自动创建(生成密钥或首次连接某台主机)。

ls -ld ~/.ssh

输出示例:

drwx------ 2 sara sara 4096 Mar  4 14:22 /home/sara/.ssh

sara 是属主,rwx------ 对应权限位 700——属主完全访问,阻止其他所有人访问。

坑位: OpenSSH 不要求目录中每个文件都保密,但——组或其他用户拥有写权限会让服务器拒绝 authorized_keys;私钥权限过于宽松会让客户端忽略该密钥

私钥与公钥

生成密钥对(两个文件落入 ~/.ssh):

ssh-keygen -t ed25519 -C "sara@workstation"

输出示例:Generating public/private ed25519 key pair. Enter file in which to save the key (/home/sara/.ssh/id_ed25519): ——按回车接受默认路径。

  • id_ed25519私钥:必须留在生成它的那台机器上,绝不可共享。权限 600(仅属主可读写);只要组用户可读,OpenSSH 就会拒绝使用
  • id_ed25519.pub公钥:用途就是复制到其他机器、粘贴到托管平台后台、或添加到服务器 ~/.ssh/authorized_keys。权限通常 644

老系统: 可能看到 id_rsaid_rsa.pub,OpenSSH 认识这些默认文件名,未设置 IdentityFile 时会自动尝试。新密钥 Ed25519 是更优默认:密钥更小、认证更快。

authorized_keys(服务器端)

列出允许以该用户身份登录的公钥,每一行是一个完整公钥,与客户端 .pub 文件内容完全一致:

cat ~/.ssh/authorized_keys

输出示例:

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE2... sara@workstation
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPgs... sara@laptop

每行授权一个公钥,末尾可选注释(如 sara@workstation)帮识别来源。

  • 权限 600,必须归属于使用它的账号,不能被其他用户写入
  • StrictModes(默认开启)还会检查父级路径:即便 ~/.ssh 权限正确,主目录也不能对组或其他用户开放写权限
  • 复制公钥用 ssh-copy-id [email protected]不要手动编辑文件——该命令追加公钥并避免覆盖已有密钥

known_hosts

记录此前连接过的服务器主机密钥,防止中间人冒充。首次连接某台新主机时,OpenSSH 打印主机指纹并请求确认;确认后密钥被追加到此文件。此后该主机密钥一旦变化,触发强烈警告而不是静默重连。

ssh-keygen -F example.com

输出示例(显示匹配条目及行号):

# Host example.com found: line 3
|1|abc...=|def...=  ssh-ed25519 AAAAC3Nz...

末尾 |1| 表示主机名已被哈希(hash)——客户端配置启用 HashKnownHosts yes 时使用此格式(上游默认 no;你的 Linux 发行版可能在 /etc/ssh/ssh_config 中开启)。

服务器更换主机密钥(如重装系统)后:只删除旧条目,不要删整个文件:

ssh-keygen -R example.com

权限 644 常见;共享机器上可用 600 防止其他用户读取未哈希的服务器名称。

config

按主机区分别名与默认参数:

Host work-server
    HostName example.com
    User sara
    Port 2222
    IdentityFile ~/.ssh/id_ed25519_work
    IdentitiesOnly yes

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3

有了它,ssh work-server 会以 sara 身份经 2222 端口连接 example.com,且仅使用指定密钥Host * 块适用于所有主机,适合放保活等默认设置。

  • OpenSSH 对每个选项取它找到的第一个值 → 具体主机块放前面,通用设置放底部
  • 权限 600:不能被其他用户写入(否则拒绝),也防止其他用户读你的主机名和账号名

重置 SSH 权限(复制/恢复后认证失败,先跑这个)

chmod 700 ~/.ssh
find ~/.ssh -maxdepth 1 -type f -name 'id_*' ! -name '*.pub' -exec chmod 600 {} +
find ~/.ssh -maxdepth 1 -type f -name '*.pub' -exec chmod 644 {} +
for file in authorized_keys config; do
    [ -e "$HOME/.ssh/$file" ] && chmod 600 "$HOME/.ssh/$file"
done
[ -e ~/.ssh/known_hosts ] && chmod 644 ~/.ssh/known_hosts

第一条 find 把私钥设为 600,第二条把公钥设为 644;后续 [ -e ... ] 检查只更新已存在文件——无论客户端还是服务器账号,直接跑整段脚本都不会因文件缺失报错

客户端与服务器的目录差异

同一个 ~/.ssh,机器在特定会话中充当客户端还是服务器,存放文件不同。

典型客户端(密钥对 + 连接配置 + 已知服务器记录):

config  id_ed25519  id_ed25519.pub  known_hosts

典型服务器账号(只需要 authorized_keys 即可接受密钥登录):

authorized_keys

一台机器可同时是客户端又是服务器:工作站用私钥发起对外连接,同时保留 authorized_keys 接收传入的 SCP 传输。

SSH 权限速查表

路径 用途 权限
~/.ssh/ 目录本身 700
~/.ssh/id_ed25519id_rsa 私钥 600
~/.ssh/id_ed25519.pubid_rsa.pub 公钥 644
~/.ssh/authorized_keys 允许登录本账号的公钥 600
~/.ssh/known_hosts 曾连接过的主机密钥 644
~/.ssh/config 客户端配置与按主机别名 600

总结

私钥证明你是谁,公钥让别人认得你,authorized_keys 决定谁能进服务器,known_hosts 防止你连到冒牌服务器,config 帮你省去重复输入。

权限口诀:目录 700,私钥和 authorized_keys 600,公钥和 known_hosts 644。文件复制或恢复后密钥认证失败时——先查这些权限,往往一步定位。

关联页面

页面关联点
ssh-connection-debugging-guideSSH 连接调试完全指南:ssh -vvv 输出解读 / 服务端日志联查 / 典型问题排查
ssh-brute-force-protection-guideSSH 暴力破解防御指南:公钥认证 / fail2ban / 2FA / 入侵检测 / 应急处置
scp-rsync-file-transferSCP/RSYNC 文件传输:免密配置、目录同步与常见坑
server-security-hardening-checklist服务器安全加固清单:20 项新机器上线前必做操作 / SSH 加固
linux-hacked-server-emergency-responseLinux 服务器入侵应急响应清单:SSH 加固 / 后门排查 / 取证快照