虚拟机公共密钥(Public Key)本质上是一串加密字符,用于替代密码验证登录虚拟机,配置后无需输入密码即可完成SSH连接,同时显著提升安全性,它的核心机制是“公钥加密、私钥解密”的非对称加密配对,公钥放在虚拟机里,私钥保存在本地,两者配对成功才能放行。
公共密钥的工作原理是什么?
非对称加密的核心逻辑
公共密钥登录依赖一对密钥:公钥和私钥,公钥相当于一把锁,安装在虚拟机的~/.ssh/authorized_keys文件中;私钥相当于钥匙,保存在你的本地电脑上,当你发起SSH连接时,虚拟机会用公钥生成一道随机密码题,只有持有对应私钥的客户端才能解出正确答案。
为什么比密码登录更安全
密码登录存在两大隐患:暴力破解和密码泄露,公钥认证则完全不同,私钥文件长度通常为2048位或4096位,暴力穷举在数学上不可行,据行业安全报告,启用密钥登录后,服务器被暴力破解的概率大幅下降,即使虚拟机被入侵,攻击者拿到的也仅仅是公钥,无法反推出私钥。
公钥与私钥的对比
| 项目 | 公钥 | 私钥 |
|---|---|---|
| 存放位置 | 虚拟机(服务器端) | 本地电脑(客户端) |
| 权限要求 | 必须为600或更严格 | 必须为600 |
| 泄露风险 | 泄露不影响安全 | 泄露需立即吊销 |
| 用途 | 加密验证请求 | 解密完成认证 |
虚拟机密钥怎么配置?分步骤操作
第一步:在本地生成密钥对
打开终端(Windows使用PowerShell,macOS/Linux使用自带终端),输入:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
系统会询问保存路径,默认在~/.ssh/id_rsa,建议直接回车使用默认路径,随后提示设置私钥口令(passphrase),这是额外一层保护,即使私钥文件被盗也无法直接使用,但每次连接需要输入一次口令。
第二步:将公钥上传到虚拟机
执行以下命令将公钥内容追加到虚拟机的授权列表:
ssh-copy-id user@your_vm_ip
输入一次虚拟机密码后,公钥自动写入,如果你的系统没有
ssh-copy-id命令,手动执行:
cat ~/.ssh/id_rsa.pub | ssh user@your_vm_ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
第三步:测试免密登录
ssh user@your_vm_ip
如果一切正常,无需输入密码直接进入系统,Windows用户在PowerShell中操作时,如果使用非OpenSSH客户端(如PuTTY),需要在PuTTYgen中导入私钥并转换格式。
虚拟机公钥和私钥的区别,如何理解?
文件格式差异
公钥文件通常以.pub内容是一行以ssh-rsa开头的长字符串,末尾带注释,私钥文件没有扩展名,内容以-----BEGIN RSA PRIVATE KEY-----开头,两者格式完全不同,互不可推断。
在连接过程中扮演的角色
当你执行SSH连接时,虚拟机会从authorized_keys文件中读取公钥,生成一个随机挑战发送给客户端,客户端用私钥对该挑战进行签名,虚拟机验证签名合法后,才允许建立会话,整个过程,私钥始终不离开你的电脑。
日常使用中的误区
多数人混淆两者的用途,公钥可以公开给任何人,甚至放在GitHub仓库都没问题,私钥必须密不示人,任何索要私钥的行为都是钓鱼,行业共识认为:公钥是身份标识,私钥是身份凭证,凭证绝不能交给第三方。
常见应用场景与操作技巧
多台虚拟机共用一套密钥
如果你有开发、测试、生产三套环境,无需每台生成不同密钥,只需将同一个公钥分别追加到各台的authorized_keys,就能实现一套私钥登录所有机器,具体操作:重复执行ssh-copy-id,或者在每台机器上手动追加公钥内容。
为不同用户配置不同公钥
每台虚拟机可以存在多个用户,每个用户有自己的~/.ssh/authorized_keys,例如root用户和deploy用户各存一份公钥,管理上互不干扰,配置时注意文件所有者必须是对应用户,否则SSH服务会拒绝读取。
彻底关闭密码登录
公钥验证成功后,可以修改虚拟机SSH配置强化安全,编辑/etc/ssh/sshd_config,找到以下行:
PasswordAuthentication no PubkeyAuthentication yes
修改后重启服务:
sudo systemctl restart sshd
重启前务必在当前会话中测试密钥登录是否正常,防止把自己锁在外面,多数云服务商(如简米云、酷番云)的安全组规则还允许额外限制SSH端口来源IP,搭配密钥登录构成双重防护。
排查连接失败的命令
ssh -v user@your_vm_ip:输出详细连接日志,查看认证过程卡在哪一步。ls -l ~/.ssh/authorized_keys:检查文件权限是否为600。journalctl -u sshd:查看系统日志中的认证错误记录。restorecon -R ~/.ssh:SELinux开启时恢复上下文。
Windows虚拟机如何配置密钥登录?
Windows Server 2019及以上版本自带OpenSSH Server,但配置路径与Linux不同,管理员权限打开PowerShell:
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 Start-Service sshd
公钥文件需要放在C:Users你的用户名.sshauthorized_keys,且administrators组以外的用户需要对authorized_keys文件设置只读权限,设置方法用icacls命令:
icacls C:Users用户名.sshauthorized_keys /inheritance:r /grant "用户名:F" /grant "SYSTEM:F"
Windows的administrators用户组权限较高,SSH服务默认允许管理员使用密钥登录,但普通用户需要额外配置sshd_config中的Match Group administrators规则。
密钥管理的最佳实践
定期轮换密钥
密钥使用时间越长,泄露风险越高,建议每半年生成一次新密钥对,替换虚拟机上的公钥,并注销旧公钥,操作时先添加新公钥,验证新私钥可登录后再删除旧公钥,避免中断业务。
私钥加密保护
生成密钥时设置passphrase,配合ssh-agent工具使用,在本地启动ssh-agent后,输入一次passphrase,后续连接无需重复输入:
eval $(ssh-agent) ssh-add ~/.ssh/id_rsa
macOS用户可以用ssh-add --apple-use-keychain将passphrase存入钥匙串,实现免输入体验。
备份与撤销机制
私钥备份应存储在加密U盘或密码管理器中,不建议存放在网盘,一旦发现私钥泄露,立即从所有虚拟机的authorized_keys
中删除对应公钥,同时检查服务器登录日志,确认是否存在可疑操作。
公共密钥配置中常见的坑
- 权限过于宽松:
authorized_keys如果权限不是600,SSH服务会拒绝使用它,设置chmod 600 ~/.ssh/authorized_keys。 - 文件所有者错误:
~/.ssh目录必须属于当前登录用户,不能是root或其他人,用chown -R 用户名:用户名 ~/.ssh修正。 - Cloud-init覆盖:部分云服务器重启后,Cloud-init会重新初始化
authorized_keys,导致手动添加的公钥消失,需修改/etc/cloud/cloud.cfg中的ssh_authorized_keys配置。 - SELinux阻断:CentOS/RHEL系统默认SELinux状态可能拒绝SSH读取新文件,使用
restorecon -R -v ~/.ssh恢复正确上下文。
Q&A:虚拟机公共密钥常见问题
公钥登录和密码登录可以同时开启吗?
可以。sshd_config中PasswordAuthentication yes表示同时允许两种方式,多数场景下建议先保留密码登录,待密钥验证无误后再关闭,开启两者时,SSH会优先尝试密钥认证,失败后回退到密码,这样既不安全也容易困惑,运维人员通常的做法是:测试阶段双开,正式环境关闭密码。
公钥泄露了会有什么后果?
公钥本身是公开信息,泄露后攻击者无法直接利用,但会带来枚举风险,攻击者可以尝试将泄露的公钥与暴力破解获取的私钥配对,或者利用公钥探测目标虚拟机是否使用相同的密钥对,因此公钥泄露后需要评估:该公钥是否在多台机器重复使用,如果重复使用,建议轮换所有涉及机器的密钥对。
虚拟机密钥登录和云厂商VNC登录有什么关系?
VNC登录是云控制台提供的带外管理通道,不依赖SSH服务,即使系统网络异常或SSH配置错误也能通过VNC进入系统,密钥登录属于系统内部的SSH认证机制,两者互为补充,当SSH配置错误导致无法连接时,可以通过VNC登录修复配置,这比物理接触服务器更高效,据云计算行业统计,大部分SSH连接故障都是可以通过VNC恢复的。
公共密钥配置一次,长期受益,它既解决了密码暴力破解的风险,也简化了日常登录操作,无论你管理一台还是上百台虚拟机,公钥认证都是基础设施安全的必要环节。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/617244.html





