🔑 SSH 生成公钥(密钥对)完整指南Windows/WSL2 通用)
💡 核心概念 :执行 ssh-keygen 会同时生成公钥 + 私钥 (公钥是私钥的衍生品,无法单独生成公钥)
🚀 一键生成(推荐方案)
✅ Windows PowerShell(管理员非必需)
# 生成 ED25519 密钥(现代首选,更快更安全)
ssh-keygen -t ed25519 -C "your_email@example.com" -f "$env:USERPROFILE\.ssh\id_wsl2_new"
# 或生成 RSA 4096(兼容旧系统)
# ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f "$env:USERPROFILE\.ssh\id_rsa_new"
✅ WSL2 Ubuntu 终端
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_wsl2_new
📝 交互过程详解(按提示操作)
Generating public/private ed25519 key pair.
Enter file in which to save the key (/c/Users/wxf81/.ssh/id_wsl2_new): [直接回车]
Enter passphrase (empty for no passphrase): [强烈建议设置!]
Enter same passphrase again: [再次输入]
Your identification has been saved in /c/Users/wxf81/.ssh/id_wsl2_new
Your public key has been saved in /c/Users/wxf81/.ssh/id_wsl2_new.pub # ← 公钥文件
选项 建议 说明 保存路径 直接回车(用默认) 避免路径混乱 Passphrase ✅ 设置强密码 私钥被盗时的最后一道防线(可用 KeePass 管理) 覆盖提示 ❌ 拒绝覆盖现有密钥 输入 n 保留原密钥
🔍 生成后关键操作
1️⃣ 查看/复制公钥内容(用于添加到服务器)
# Windows:复制公钥到剪贴板(一键粘贴到 WSL2)
Get-Content "$env:USERPROFILE\.ssh\id_wsl2_new.pub" | clip
Write-Host "✅ 公钥已复制到剪贴板!"
# WSL2:查看公钥(用于验证)
cat ~/.ssh/id_wsl2_new.pub
2️⃣ 上传公钥到 WSL2(三选一)
# 方法1:PowerShell 一键追加(推荐)
Get-Content "$env:USERPROFILE\.ssh\id_wsl2_new.pub" | ssh WSL2-Ubuntu-TEST "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# 方法2:手动粘贴(WSL2 内执行)
nano ~/.ssh/authorized_keys # 粘贴剪贴板内容 → Ctrl+O 保存 → Ctrl+X 退出
# 方法3:使用 ssh-copy-id(需安装)
ssh-copy-id -i "$env:USERPROFILE\.ssh\id_wsl2_new" -p 2222 wuxiufeng@10.10.3.202
3️⃣ 修复私钥权限(Windows 必做!)
icacls "$env:USERPROFILE\.ssh\id_wsl2_new" /inheritance:r /grant:r "$env:USERNAME:F"
Write-Host "✅ 私钥权限已加固"
📌 重要安全原则
项目 正确做法 错误做法 私钥 仅存本地 + 设置权限 + 可设 passphrase 上传 GitHub/网盘/微信 公钥 可安全分发到多台服务器 与私钥混淆保管 密钥命名 按用途命名:id_wsl2_laptop, id_wsl2_phone 全用默认 id_rsa Passphrase ✅ 设置 + 用 ssh-agent 管理 ❌ 留空(便利但高风险)
💡 高级技巧(按需使用)
🔐 无交互生成(脚本自动化用)
# 生成无 passphrase 密钥(仅限可信环境!)
ssh-keygen -t ed25519 -f "$env:USERPROFILE\.ssh\id_auto" -N "" -C "auto-deploy"
🌐 指定算法兼容旧服务器
# 生成 RSA 4096(兼容 CentOS 6 等旧系统)
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_legacy -C "legacy-server"
🔄 查看已有密钥指纹(验证身份)
ssh-keygen -l -f "$env:USERPROFILE\.ssh\id_wsl2_new.pub"
# 输出:256 SHA256:xxxxxx your_email@example.com (ED25519)
✅ 生成后验证清单
步骤 命令 预期结果 1. 检查文件存在 Test-Path "$env:USERPROFILE\.ssh\id_wsl2_new.pub"True2. 检查公钥格式 Get-Content ...\.pub以 ssh-ed25519 AAAA... 开头 3. 测试连接 ssh -i "...\.ssh\id_wsl2_new" WSL2-Ubuntu-TEST无需密码登录成功 4. 权限验证 icacls ...\.ssh\id_wsl2_new仅当前用户有完全控制权
⚠️ 常见陷阱
问题 原因 解决 @@@@@@@@ WARNING: UNPROTECTED PRIVATE KEY FILE!私钥权限过宽 执行 icacls 修复权限 生成后仍要密码 1. 未用新密钥连接2. passphrase 未通过 ssh-agent 加载 1. 指定 -i 参数测试2. ssh-add "新私钥路径" 公钥内容异常 用记事本编辑过(添加BOM) 用 VSCode/Notepad++ 保存为 UTF-8 无 BOM
🌟 终极建议
为每台设备生成独立密钥 (命名如 id_wsl2_laptop)
设置 passphrase + 启用 ssh-agent (安全与便利兼得)
公钥上传后立即测试 :
ssh -i "$env:USERPROFILE\.ssh\id_wsl2_new" -p 2222 wuxiufeng@10.10.3.202
旧密钥保留备份 :重命名 id_wsl2_old 而非删除
✨ 记住 :公钥 = 你家的“钥匙模具”(可分发) 私钥 = 你手里的“实体钥匙”(绝对保密!) 生成后,将公钥内容粘贴到 WSL2 的 ~/.ssh/authorized_keys,即可实现安全免密登录 🔒➡️🚀