1. 项目概述:为什么我们需要告别密码登录?
如果你还在用“用户名+密码”的方式登录你的阿里云或腾讯云服务器,那就像是用一把生锈的挂锁守护你的金库。每次登录,密码在网络中传输,都伴随着被截获的风险。尤其是在自动化脚本、CI/CD流水线或日常频繁运维的场景下,手动输入密码不仅效率低下,更是安全上的巨大隐患。
SSH密钥对登录,正是解决这个痛点的标准答案。它基于非对称加密原理,彻底摒弃了密码传输。简单来说,你本地生成一对密钥:一把私钥(绝对保密,存于本地),一把公钥(可以公开,放到服务器上)。登录时,服务器用你预留的公钥出一道“数学题”,只有持有对应私钥的你才能解出答案,从而证明身份。整个过程,私钥从未离开你的电脑,从根本上杜绝了密码泄露和暴力破解的风险。
而WindTerm,作为一款功能强大且免费的终端工具,其对SSH协议的原生支持和优秀的密钥管理功能,让它成为连接云服务器的绝佳搭档。今天,我就以一个运维老手的视角,带你从零开始,在WindTerm中生成密钥对,并正确配置到阿里云和腾讯云服务器上,实现真正的一键安全登录。这个流程不仅适用于个人开发者,对于团队统一管理服务器访问权限,同样具有极高的参考价值。
2. 核心原理与准备工作:理解密钥对的“锁与钥匙”
在动手之前,我们必须把核心原理吃透,这能帮你避开后面90%的坑。SSH密钥认证不是魔法,其安全性完全建立在非对称加密的数学基础之上。
2.1 非对称加密:公钥与私钥的角色
想象一下,你有一把特殊的锁(公钥)和唯一能打开它的钥匙(私钥)。这把锁的设计非常巧妙,任何人拿到它都可以把门锁上(加密数据),但一旦锁上,只有你那把唯一的钥匙才能打开(解密数据)。
在SSH登录场景中:
- 公钥 (Public Key):就是这把“锁”。它的内容是一长串字符,通常以
ssh-rsa AAAAB3...或ecdsa-sha2-nistp256 AAAAE2...开头。你可以把它放在任何需要的地方(比如服务器的~/.ssh/authorized_keys文件里),完全公开也没有关系。 - 私钥 (Private Key):就是那把“唯一的钥匙”。它通常保存在你本地电脑的
~/.ssh/目录下,文件名可能是id_rsa,id_ecdsa,ed25519等。你必须像保护银行卡密码一样保护它,绝不能泄露给任何人。私钥文件本身也常常通过一个“密码短语”进行二次加密,即使文件被盗,没有密码短语也无法使用。
登录时,服务器用你事先放置的公钥加密一个随机生成的挑战消息,发送给你的客户端。你的WindTerm使用本地私钥解密这个消息,并将结果发回服务器。服务器验证解密结果正确,即确认了你拥有对应的私钥,从而允许登录。全程无需传输密码。
2.2 工具与环境准备
工欲善其事,必先利其器。开始前,请确保你已准备好以下环境:
- WindTerm安装:前往WindTerm的GitHub发布页或官网下载最新版本。它是一款绿色软件,解压即可运行,兼容Windows、macOS和Linux。
- 云服务器实例:确保你拥有一台正在运行的阿里云ECS或腾讯云CVM实例,并知道其公网IP地址。同时,你需要拥有一个可以通过密码登录的初始账户(通常是
root或ubuntu,centos等系统用户)。 - 基础网络连通性:确保你的本地网络可以访问云服务器的22端口(SSH默认端口)。你可以通过
ping <你的服务器IP>和telnet <你的服务器IP> 22(或使用nc -zv <你的服务器IP> 22)来测试。
注意:在配置密钥登录的整个过程中,请务必保持一个可用的密码登录SSH会话窗口处于打开状态。这是你的“救命通道”,万一密钥配置出错导致无法登录,你还可以通过密码连接上去进行修复。
3. 在WindTerm中生成与管理SSH密钥对
WindTerm内置了便捷的密钥生成和管理器,这比使用命令行ssh-keygen对新手更为友好。
3.1 生成新的密钥对
打开WindTerm,按照以下步骤操作:
点击顶部菜单栏的
Session->Authentication->Manage Public Keys...。这会打开密钥管理对话框。在管理对话框中,点击
Generate按钮。这时会弹出密钥生成向导,你需要关注几个关键参数:
- Key Type (密钥类型):这是最重要的选择。目前主流且推荐的有两种:
- ed25519:当前最安全、性能最好的算法。它生成的密钥更短,签名速度更快,且安全性被认为高于相同长度的RSA。如果你的WindTerm和服务器OpenSSH版本都较新(一般近5年内的系统都支持),无脑选这个。
- RSA:历史最悠久,兼容性最好。如果服务器系统版本非常老旧(比如CentOS 6),可能只支持RSA。密钥长度建议选择4096 bits,2048位已逐渐被认为不够安全。
- Key Size (密钥长度):选择ed25519时长度固定。选择RSA时,请务必选择4096。
- Comment (注释):这里可以填写一个标识,比如
your_email@example.com或my-aws-ec2。这个注释会附在公钥末尾,帮助你区分不同的密钥。 - Passphrase (密码短语):强烈建议设置!这为你的私钥加上了一层密码保护。即使私钥文件不慎泄露,对方没有密码短语也无法使用。请设置一个强密码并牢记。
- Key Type (密钥类型):这是最重要的选择。目前主流且推荐的有两种:
点击
Generate,WindTerm会开始生成密钥。过程中你可能会被要求随机移动鼠标以生成随机数熵,这是正常的安全操作。生成完成后,WindTerm会显示你的公钥内容。请务必点击
Save public key和Save private key,将它们保存到你指定的安全目录,例如D:\ssh_keys\。建议使用有意义的文件名,如my_aliyun_ed25519和my_aliyun_ed25519.pub。
3.2 密钥的保存与备份策略
私钥的安全就是服务器安全的第一道防线。请遵循以下最佳实践:
- 本地存储:将私钥保存在你的个人电脑上,并确保其文件权限设置为仅当前用户可读。在Linux/macOS上,可以通过
chmod 600 ~/.ssh/id_ed25519命令实现。 - 绝不传输:永远不要通过电子邮件、即时通讯工具或任何不加密的通道发送你的私钥文件。
- 安全备份:将加密后的私钥文件(以及密码短语)备份到安全的离线存储介质,如加密的U盘或硬件密码管理器。公钥则无需保密,可以随意备份。
- 一机一钥:对于不同的服务器或服务器组,建议使用不同的密钥对。这样即使某一台服务器的密钥泄露,也不会危及其他服务器。
4. 将公钥部署到阿里云与腾讯云服务器
生成密钥对后,下一步就是将公钥“安装”到你的服务器上。有两种主流方法:通过云平台控制台注入,或通过SSH命令手动上传。我强烈推荐第一种方法,因为它更规范,且能被云平台的服务(如控制台登录、云助手等)识别。
4.1 方法一:通过云平台控制台注入(推荐)
这种方法将公钥作为云服务器的“登录凭证”进行管理,与服务器实例元数据绑定,更加清晰和安全。
对于阿里云ECS:
- 登录阿里云控制台,进入ECS实例列表。
- 找到目标实例,在“操作”列中,点击“更多” -> “密码和密钥” -> “重置实例密码”。别被名字迷惑,这里同样管理密钥。
- 在弹出的侧边栏中,切换到“SSH密钥对”标签页。
- 点击“创建或导入密钥对”。
- 如果你是第一次使用,可以选择“创建密钥对”,阿里云会帮你生成并让你下载私钥(格式为.pem)。但我们已经用WindTerm生成了,所以这里选择“导入密钥对”。
- 在“导入密钥对”对话框中,为密钥对起个名字(如
windterm-key),然后将WindTerm生成的公钥文件(.pub文件)的全部内容复制粘贴到“公钥内容”文本框里。 - 点击“确定”导入。导入成功后,在实例的“密钥对”列表里,点击“绑定密钥对”,选择你刚导入的密钥对,并确认绑定。
- 绑定后,你需要重启ECS实例,新的密钥才会生效。重启可以通过控制台操作。
对于腾讯云CVM:
- 登录腾讯云控制台,进入CVM实例列表。
- 点击目标实例的ID/名称,进入实例详情页。
- 在左侧导航栏,点击“密钥”。
- 点击“创建密钥”。
- 同样,选择“使用已有公钥”。
- 为密钥命名(如
windterm-key),将WindTerm生成的公钥内容粘贴到“公钥”字段中。 - 点击“确定”创建。
- 创建成功后,在密钥列表中找到该密钥,点击右侧的“绑定/解绑”,在弹出的窗口中选择你的目标CVM实例,点击“确定”进行绑定。
- 与阿里云不同,腾讯云绑定密钥后,通常需要关机再开机(控制台操作)才能使密钥登录生效。注意,是“关机-开机”,不是“重启”,因为重启可能不会重新加载密钥元数据。
实操心得:通过控制台绑定密钥后,系统会自动帮你将公钥写入服务器内指定用户的
~/.ssh/authorized_keys文件。在阿里云中,默认用户是root;在腾讯云中,取决于你创建实例时选择的镜像(如Ubuntu镜像是ubuntu用户)。这是最省心、最不易出错的方式。
4.2 方法二:通过SSH命令手动上传(备用方案)
如果控制台操作不便,或者你需要将密钥部署给非默认用户(例如新建的deploy用户),可以使用此方法。
- 首先,确保你已经能用密码通过WindTerm或其它终端登录到服务器。
- 在WindTerm中,打开你保存公钥的
.pub文件,复制其全部内容。 - 在已连接的服务器终端中,执行以下命令序列:
# 1. 确保 .ssh 目录存在,并设置正确的权限 mkdir -p ~/.ssh chmod 700 ~/.ssh # 2. 将公钥追加到 authorized_keys 文件 echo “你复制的公钥内容” >> ~/.ssh/authorized_keys # 3. 设置 authorized_keys 文件的权限(至关重要!) chmod 600 ~/.ssh/authorized_keys这里有一个巨坑:~/.ssh目录的权限必须是700(drwx------),authorized_keys文件的权限必须是600(-rw-------)。如果权限设置不对,OpenSSH出于安全考虑会直接拒绝使用密钥登录,你会遇到“Permission denied (publickey)”的错误而百思不得其解。
5. 在WindTerm中配置会话使用密钥登录
公钥部署到服务器后,我们需要告诉WindTerm,在连接这个服务器时使用我们刚生成的私钥。
- 在WindTerm主界面,点击
Session->New Session,或者点击工具栏的“新建会话”图标。 - 在新建会话对话框中,选择
SSH协议。 - 在
Host字段填写你的服务器公网IP地址。 Port保持默认的22(如果你修改过SSH端口,请填写修改后的端口)。- 最关键的一步:在
Authentication部分,将方法从默认的Password改为Public Key。 - 点击
Public Key下拉框右侧的文件夹图标,浏览并选择你之前保存的私钥文件(例如my_aliyun_ed25519,注意没有.pub后缀)。 - 如果你的私钥设置了密码短语(Passphrase),在
Passphrase字段输入它。 - 在
User字段填写用户名。这需要与你部署公钥时对应的用户名一致:- 通过阿里云控制台绑定,默认用户是
root。 - 通过腾讯云控制台绑定,Ubuntu系统是
ubuntu,CentOS系统是root或centos(具体看镜像说明)。 - 通过手动命令上传,就是你执行命令时所在的用户。
- 通过阿里云控制台绑定,默认用户是
- 你可以给这个会话起个名字(如
阿里云生产服务器),然后点击Connect。
如果一切配置正确,WindTerm将直接连接服务器,无需输入密码。首次连接时会询问你是否信任主机密钥,点击“Accept & Save”即可。
6. 强化安全:禁用密码登录与更改SSH端口
实现密钥一键登录后,密码登录就变成了一个安全隐患入口。我们应该关闭它。同时,修改默认的SSH端口(22)可以避开互联网上大量的自动化扫描和爆破攻击。
警告:在进行以下操作前,请务必确保你的密钥登录已经100%测试成功,并且保持一个可用的密码登录会话窗口打开,以备出错时恢复。
6.1 禁用SSH密码登录
通过密钥登录到服务器,然后编辑SSH服务端配置文件:
sudo vim /etc/ssh/sshd_config找到以下两行,并将其值修改为no:
# 禁止使用密码认证 PasswordAuthentication no # 禁止空密码登录(通常默认就是no) PermitEmptyPasswords no # 如果你使用的是较新版本的OpenSSH,可能还需要关注这个选项,确保其为默认的 `prohibit-password` 或 `no` # PubkeyAuthentication yes # 这一行确保是 yes,默认就是6.2 修改SSH默认端口
在同一个/etc/ssh/sshd_config文件中,找到#Port 22这一行。去掉开头的注释#,并将22改为一个1024到65535之间、未被系统其他服务占用的端口号,例如5922。
Port 59226.3 应用配置并重启服务
修改完成后,保存文件并退出编辑器。然后重启SSH服务以使配置生效:
对于使用systemd的系统(如CentOS 7+, Ubuntu 16.04+):
sudo systemctl restart sshd # 或者 sudo systemctl restart ssh对于使用SysV init的系统(如CentOS 6):
sudo service sshd restart
重启服务后,立即用新的端口和密钥在WindTerm中测试连接,而不要关闭当前的密码登录会话!
在WindTerm中新建或编辑会话,将Port从22改为你设置的端口(如5922),然后尝试连接。如果连接成功,说明配置正确。此时,你再可以关闭旧的密码登录会话。
重要注意事项:
- 防火墙:修改端口后,务必在云服务器的安全组(阿里云/腾讯云控制台)和服务器内部的防火墙(如
firewalld或ufw)中,放行你新设置的SSH端口,同时可以考虑禁止22端口的入站流量。- SELinux:如果你使用的是CentOS/RHEL系统并启用了SELinux,修改SSH端口后需要更新SELinux策略:
sudo semanage port -a -t ssh_port_t -p tcp <你的新端口号>。- 连接命令:以后在命令行中使用ssh连接时,需要指定端口:
ssh -p 5922 user@server_ip。
7. 常见问题与故障排查实录
即使按照步骤操作,你也可能会遇到一些问题。下面是我在多年运维中总结的常见“坑位”和解决方法。
7.1 连接失败:Permission denied (publickey)
这是最常见的问题。意味着服务器拒绝了你的密钥认证。请按以下顺序排查:
- 私钥路径或密码短语错误:在WindTerm会话设置中,双击检查私钥文件路径是否正确,密码短语是否输入无误(注意大小写)。
- 用户名错误:确认WindTerm中配置的用户名,与服务器上存放公钥的
~/.ssh/authorized_keys文件所属用户是同一个。 - 服务器公钥未生效:
- 控制台绑定方式:确认是否执行了重启(阿里云)或关机再开机(腾讯云)操作。
- 手动上传方式:登录服务器,检查对应用户家目录下的
~/.ssh/authorized_keys文件,确认你的公钥已正确写入。可以使用cat ~/.ssh/authorized_keys命令查看。
- 文件权限问题(手动上传的致命坑):登录服务器,执行
ls -la ~/.ssh/。必须确保:.ssh目录权限为700(drwx------)authorized_keys文件权限为600(-rw-------)- 文件所有者是正确的用户。 如果不符,使用
chmod命令修正。
- 服务器SSH配置未启用密钥登录:检查服务器
/etc/ssh/sshd_config,确保PubkeyAuthentication yes这一行存在且未被注释。 - 私钥格式问题:WindTerm生成的私钥是OpenSSH格式。如果你是从其他工具(如PuTTY的.ppk)转换而来,可能格式不对。确保使用WindTerm原生生成或使用
ssh-keygen命令生成的密钥。
7.2 连接超时或网络错误
- 安全组/防火墙:检查云服务器控制台的安全组规则,是否允许你的本地IP地址访问服务器的SSH端口(22或你修改后的端口)。
- 服务器未运行SSH服务:在服务器上执行
sudo systemctl status sshd查看服务状态。 - IP地址或端口错误:仔细核对WindTerm会话中填写的IP和端口。
7.3 修改端口后无法连接
- 安全组未更新:这是最可能的原因。在云控制台,将安全组入站规则中的端口号从22更新为你设置的新端口。
- 服务器防火墙未更新:如果服务器内启用了
firewalld或ufw,需要添加新端口的规则。例如,对于firewalld:sudo firewall-cmd --permanent --add-port=5922/tcp && sudo firewall-cmd --reload。 - SELinux问题(仅限RHEL/CentOS):如前所述,执行
sudo semanage port -a -t ssh_port_t -p tcp 5922。
7.4 首次连接后,再次连接仍需密码
这种情况通常是因为WindTerm没有正确缓存或使用私钥。
- 检查会话配置,确保认证方式已永久设置为
Public Key并选择了正确的私钥文件。 - 尝试删除WindTerm中该会话的配置,重新创建一次。
- 检查服务器上该用户的
authorized_keys文件,是否包含了多个公钥,可能存在格式错误导致后续的公钥失效。
8. 高级技巧与最佳实践
掌握了基础配置后,这些技巧能让你的SSH管理更高效、更安全。
8.1 使用SSH Config文件管理多台服务器
WindTerm支持读取本地的SSH配置文件(通常是~/.ssh/config)。你可以在此文件中为每台服务器定义别名、指定用户名、端口和私钥,这样在WindTerm中只需输入别名即可连接。
配置文件示例:
Host aliyun-prod # 自定义别名 HostName 123.123.123.123 # 服务器IP Port 5922 # SSH端口 User root # 用户名 IdentityFile ~/.ssh/my_aliyun_ed25519 # 私钥路径 ServerAliveInterval 60 # 每60秒发送保活包,防止连接断开 Host txcloud-dev HostName 234.234.234.234 Port 22 User ubuntu IdentityFile ~/.ssh/my_tx_ed25519在WindTerm新建会话时,在Host字段直接填写aliyun-prod,它就会自动应用配置文件中的所有设置。
8.2 为私钥添加代理(ssh-agent)以省去重复输入密码短语
如果你为私钥设置了强密码短语,每次连接都要输入会很麻烦。ssh-agent是一个密钥管理器,可以将解密后的私钥缓存在内存中一段时间。
- 启动代理:在WindTerm的嵌入式Shell或你的系统终端中,执行
eval “$(ssh-agent -s)”。 - 添加私钥:执行
ssh-add ~/.ssh/my_aliyun_ed25519,然后输入一次密码短语。 - 此后,在密码短语缓存的有效期内,使用该私钥的连接都不再需要输入密码。
安全提示:
ssh-agent将私钥存储在内存中。在不使用电脑时,记得锁定屏幕或执行ssh-add -D来清空代理中的所有密钥。
8.3 定期轮换密钥
出于安全最佳实践,建议每半年或一年更换一次SSH密钥对,特别是在团队成员变动时。
- 在WindTerm中生成一套新的密钥对。
- 将新公钥添加到服务器的
authorized_keys文件中(追加,不要删除旧的)。 - 用新密钥测试登录成功。
- 从
authorized_keys文件中移除旧的公钥。 - 最后,在本地安全地删除旧的私钥文件。
8.4 团队协作下的密钥管理
在团队中,不建议共享同一对私钥。最佳实践是:
- 每位成员生成自己的密钥对。
- 将各自的公钥提交到版本控制系统(如Git)的一个特定仓库或通过其他安全渠道收集。
- 在服务器上,使用自动化工具(如Ansible, Puppet)或统一的部署脚本,将所有成员的公钥批量写入服务器的
authorized_keys文件,或者为每个成员创建单独的用户账户并分别管理密钥。 - 当成员离职时,只需从列表中移除其公钥即可。
配置完成后,那种无需输入密码、瞬间安全连接上服务器的顺畅感,会让你觉得之前的所有折腾都是值得的。它不仅提升了效率,更重要的是为你的服务器筑起了一道坚固的防线。记住,安全是一个持续的过程,定期审查你的密钥、端口和安全组规则,才能让这道防线始终稳固。