1. 为什么在 Debian 11 上必须亲手配好 SSH 密钥——不是为了炫技,是为每天省下三分钟、避开七类故障
SSH 密钥登录这件事,在 Debian 11 系统里看起来只是 ssh-keygen 加几行 authorized_keys 的操作,但实际踩过坑的人才知道:它背后连着的是你每天远程连接的稳定性、VS Code Remote-SSH 插件能否正常加载、Git 推送是否被反复拦截、甚至跨局域网调试嵌入式设备时会不会卡在 Connection reset by peer 。我用 Debian 11 搭建了 17 台生产级开发/测试服务器,从树莓派到腾讯云 CVM,从内网 Kali 渗透靶机到统信 UOS 兼容环境,所有机器都强制关闭密码登录——不是因为“安全洁癖”,而是因为 一次密码输错触发 PAM 失败锁定,就可能让你在凌晨两点连不上关键服务,而密钥登录失败时,错误信息永远比密码失败更具体、更可定位 。
核心关键词 SSH、Debian 11、SSH Keys 在这个场景里不是孤立术语:SSH 是协议层骨架,Debian 11 是具体发行版约束(比如 OpenSSH 8.4p1 默认禁用 ssh-dss、 /etc/ssh/sshd_config 中 PubkeyAuthentication yes 不再默认开启),SSH Keys 则是贯穿整个链路的身份凭证载体。你搜到的那些热词—— vscode连接ssh远程服务器 、 ssh免输入密码 vscode 、 git配置ssh密钥 、 ssh连接reset by peer ——全都是这个基础动作没做扎实后,在不同应用层炸出来的碎片问题。比如 VS Code 报 Error: Failed to clone marketplace repository: SSH host key is not in your known_hosts ,表面是 known_hosts 缺失,根因往往是本地私钥权限不对导致认证流程根本没走到 host key 校验那步;又比如 ssh: could not resolve hostname d: name or service not known ,看似 DNS 问题,实则常因 ~/.ssh/config 里 Host 别名写成 d 却没配 HostName ,而这个 config 文件的生效前提是密钥体系已跑通。
适合谁来读这篇?如果你正用 Debian 11 做开发服务器、CI/CD 节点、容器宿主机,或需要频繁通过 VS Code、Cursor、Git Bash 连接它;如果你曾被 Permission denied (publickey) 卡住半小时却只在百度搜“ubuntu安装ssh”;如果你的 scp 总报 permission denied 却查不到是服务端 sshd 没读取密钥还是客户端私钥格式不兼容——那你不是在学一个功能,而是在修复一条每天高频使用的数字血管。这不是教你怎么敲命令,而是带你把每个字符背后的系统行为、权限逻辑、协议握手细节都摸透,让下次 ssh -T git@github.com 成功时,你知道为什么成功; ssh -v user@host 报 no mutual signature algorithm 时,你立刻能定位到是密钥类型与服务端支持算法不匹配。
2. 整体设计思路:为什么不用 ssh-copy-id ?为什么拒绝 root 登录?为什么密钥必须用 ed25519?
2.1 方案选型的底层逻辑:从“能连上”到“连得稳、管得住、查得清”
很多人 setup SSH keys 的第一反应是 ssh-keygen -t rsa -b 4096 && ssh-copy-id user@host ,三步搞定。但在 Debian 11 生产环境中,这方案有三个硬伤:
-
ssh-copy-id默认覆盖~/.ssh/authorized_keys权限 :它会把文件 chmod 为 600,但若用户主目录/home/user权限是 755(Debian 默认),OpenSSH 服务端会因“主目录组/其他用户可写”直接拒绝密钥认证,日志里只留一句Authentication refused: bad ownership or modes for directory /home/user。你得手动chmod 700 /home/user,而ssh-copy-id不告诉你这点。 -
RSA 4096 已非最优选 :OpenSSH 8.4p1(Debian 11 默认)虽仍支持 RSA,但 RFC 8332 明确建议优先使用 Ed25519 或 ECDSA。Ed25519 密钥长度仅 256 位,签名速度比 RSA 4096 快 10 倍以上,且抗侧信道攻击能力更强。更重要的是,Debian 11 的
sshd_config默认HostKeyAlgorithms列表中,ssh-ed25519排在rsa-sha2-512之前,意味着客户端优先协商 Ed25519,若你生成 RSA 密钥,反而可能触发算法降级,增加中间人风险。 -
root 登录密钥化 = 放弃审计入口 :
PermitRootLogin prohibit-password是 Debian 11 安装时的默认值,但很多人图省事改成yes。问题在于:root 用户无 shell 历史记录、无 sudo 日志上下文、一旦密钥泄露,攻击者直接获得最高权限且不留操作痕迹。正确做法是创建普通用户(如devops),用sudo管理权限,并在sudoers中限制命令范围,这样每次sudo systemctl restart nginx都会在/var/log/auth.log留下完整 trace。
所以我的方案是: 手动生成 ed25519 密钥 → 严格校验本地私钥权限 → 手动追加公钥到 authorized_keys 并验证文件权限 → 修改 sshd_config 启用 PubkeyAuthentication 并禁用 PasswordAuthentication → 重启 sshd 前用 sshd -t 语法检查 → 最后用 -o LogLevel=DEBUG3 实测握手过程 。每一步都可控、可回溯、可审计。
2.2 Debian 11 特有的约束条件:OpenSSH 8.4p1 的“温柔一刀”
Debian 11(Bullseye)搭载 OpenSSH 8.4p1,相比 Ubuntu 20.04 的 8.2p1 或 CentOS 7 的 7.4p1,有几处关键变化必须前置理解:
-
KexAlgorithms 默认移除 diffie-hellman-group1-sha1 :该算法因 Logjam 漏洞被弃用。若你的旧客户端(如某些嵌入式设备 SSH 客户端)只支持此算法,连接会直接失败,报错


617

被折叠的 条评论
为什么被折叠?



