【SSH】工欲善其事必先利其器
SSH工作原理
SSH(Secure Shell)的核心目标是:在不安全的网络上,建立一个安全的加密通道,让你能远程登录服务器、执行命令或传输文件。它的工作原理可以拆成三个关键问题来看:怎么认出对方、怎么协商密钥、怎么加密通信。
1. 连接建立与版本协商
客户端发起 TCP 连接(默认 22 端口)后,双方先交换版本号,比如 SSH-2.0-OpenSSH_9.6。这一步只是确认彼此都支持 SSH 协议,并选定后续使用的协议版本(现在基本都是 SSH-2)。
2. 密钥交换与主机验证(最关键的一步)
这一步同时解决两件事:生成一个只有双方知道的会话密钥,以及验证服务器身份。
密钥交换常用 Diffie-Hellman 算法(如 ECDH)。它的巧妙之处在于:双方在不安全的信道上各自生成一部分秘密,交换公开参数后,能独立计算出相同的会话密钥,而窃听者无法从公开参数推算出这个密钥。
主机验证则依赖服务器的主机密钥。首次连接时,客户端会收到服务器的主机公钥,并提示你确认指纹。确认后,这个公钥会被存进 ~/.ssh/known_hosts。之后每次连接,客户端都会比对服务器出示的公钥是否与本地记录一致。如果不一致,就会发出警告,防止中间人攻击。
3. 用户认证
安全通道建立后,接下来要证明“你是你”。常见方式有两种:
密码认证:客户端把密码通过加密通道发给服务器。简单,但容易受到暴力破解。
公钥认证(更常用、更安全):客户端事先把自己的公钥放到服务器的
~/.ssh/authorized_keys里。认证时,服务器用这个公钥加密一个随机挑战,客户端用对应的私钥解密后返回,从而证明自己持有私钥。私钥始终不离开客户端,安全性高得多。
4. 加密通信
认证通过后,所有数据都用前面协商出的会话密钥进行对称加密(如 AES、ChaCha20)。同时还会用 MAC(消息认证码) 保证数据完整性,防止被篡改。对称加密速度快,适合持续传输大量数据。
ECS 使用SSH登录
# 放到 c:/Users/用户名/.ssh, 建议直接在这位置打开powershell
ssh-keygen -t ed25519 -C "你的邮箱或备注" #本地生成密钥对
Enter file in which to save the key: ← 直接回车(默认路径)
Enter passphrase: ← 直接回车(不设密码)
Enter same passphrase again: ← 直接回车
# 方法一,上传公钥到服务器,用Git Bash,无则安装一个git,在其界面可以像操作linux那样命令行操作window系统
ssh-copy-id root@服务器IP
# 方法二, 直接手动复制,最原始的方法
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "粘贴公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_key
# 之后就使用Xshell/finalshell 工具使用密钥登录即可
# 之后创建一个用户,加入wheel组,然后禁止root远程登录
sudo vim /etc/ssh/sshd_config
PermitRootLogin no # 禁止root用户远程登录
PasswordAuthentication no # 禁止所有用户密码登录
sudo systemctl restart sshd # 重启ssh
Gitee 使用 SSH 连接
本地生成25519密钥对,把公钥上传只gitee
# 配好config的前提下,
ssh -T gitee.com # 等同于 ssh -T git@gitee.com
#
本地ssh密钥管理
随着大量密钥存放在.ssh/目录下,会显得杂而乱,变得不好管理,这时候就需要config表来做映射管理。Host是别名,但有些写法还是得把用户名写上,那么config最大的用处是决定用哪把钥匙。
# 在.ssh目录下创建多个目录,不同目录放不同密钥,例如gitee,ecs等
# config 表如下:
Host gitee.com
HostName gitee.com
User git
IdentityFile C:\Users\用户名\.ssh\blog\gitee\id_ed25519
IdentitiesOnly yes # 匹配上仅验证该私钥,错误了不再逐个尝试,免得错误次数太多被ban
Host ecs-blog
HostName 服务器的ip地址
User 服务器用户名
IdentityFile C:\Users\用户名\.ssh\blog\ecs\id_ed25519
Port 22
IdentitiesOnly yes
# known_hosts 该文件存放对方的指纹,再次连接验证对方是否为真正请求的目标
