ssh介绍

ssh全称secure shell (安全外壳协议),是一种用于在不安全的网络环境中,为远程登陆和其他网络服务提供安全加密通信的网络协议^1

工作原理

ssh采用非对称加密和对称加密结合的方式保证安全

身份验证阶段

服务器会提供公钥[^2],客户端验证服务器身份;同时客户端通过密码对(公私钥)完成身份认证,确认用户有权限登陆。

数据传输阶段

认证成功后,双方会协商生成一个临时的对称加密密钥,后续所有通信都通过该密钥加密,兼顾安全性和传输效率。

window中ssh的默认行为

默认连接端口

连接远程服务器是,默认使用22端口(行业标准),若远程服务器未修改ssh端口,执行ssh 用户@服务器ip命令即可省略端口参数。首次连接陌生服务器时,会提示验证服务器指纹并询问是否继续,输入yes后,服务器指纹会把保存到==C:\Users\你的用户名.ssh\known_hosts==文件,后续连接同一服务器不再验证

默认协议与加密

仅支持SSHV2协议,不兼容SSHv1;ssh-keygen命令生成密钥时,默认采用Ed25519算法,若未指定算法,生成的密钥文件名为id_ed25519私钥和id_ed25519.pub公钥、

默认shell环境

当通过ssh客户端连接到windows ssh服务器时,默认启动的命令行shell是cmd,而非powershell或其他终端。

身份认证相关默认行为

  • 服务器公钥自动生成:Windows SSH 服务器启动时,会检查%programdata%\ssh\目录下是否存在 ssh_host_rsa_key、ssh_host_ed25519_key 等主机密钥文件。若文件缺失,服务会自动生成这些密钥,用于向客户端验证服务器身份。
  • 公钥认证文件路径:服务器端默认通过%userprofile%\.ssh\authorized_keys文件验证客户端公钥。对于管理员账户,还会优先读取%programdata%\ssh\administrators_authorized_keys文件,以此控制管理员账户的 SSH 公钥登录权限。
  • GSSAPI 认证默认关闭:GSSAPI(基于 Kerberos 的认证方式)默认配置为关闭状态(GSSAPIAuthentication no),默认优先采用密码认证或密钥认证方式。

服务与权限默认行为

  • 服务启动与配置:SSH 服务器(sshd)默认读取%programdata%\ssh\sshd_config配置文件,若该文件缺失,启动服务时会自动生成默认配置文件。且服务启动后修改配置文件,需重启 sshd 服务才能使新配置生效。
  • 防火墙规则差异:Windows 10 中启用 SSH 服务器后,需手动配置防火墙规则放行 22 端口;而 Windows 11 会自动启用防火墙规则,允许 SSH 流量通过 22 端口。
  • 权限限制:Windows 无 Linux 的 root 用户概念,默认不支持 PermitRootLogin 配置。若要禁止管理员登录,需通过 sshd_config 中的 DenyGroups 指令配置,而非修改 root 相关参数。同时,authorized_keys等密钥文件默认会限制权限,仅当前用户可读写,避免其他账户篡改。

关联工具默认行为

  • 辅助命令默认依赖scp(远程文件复制)、sftp(安全文件传输)工具默认基于 SSH 协议工作,无需额外配置,可直接使用,且默认沿用 SSH 的端口、密钥等配置,例如scp 本地文件 用户名@服务器IP:目标路径命令会默认通过 22 端口传输。
  • 密钥代理默认状态ssh-agent工具默认未自动启动,需手动在 PowerShell 中执行Start-Service ssh-agent启动服务,之后通过ssh-add命令添加的私钥才会被缓存,实现临时免密登录,重启电脑后缓存会失效。

ssh-agent的使用

windows中ssh工具的操作逻辑

默认密钥位置

默认保存在当前用户目录下的.ssh 文件夹中,路径为
C:\Users\你的用户名\.ssh\
生成的密钥文件默认名为 id_rsa(私钥)和 id_rsa.pub(公钥),若选择 Ed25519 算法,文件名则为 id_ed25519 和 id_ed25519.pub。

默认config文件位置

分为用户级和系统级两类。用户级配置文件路径是
C:\Users\你的用户名\.ssh\config
系统级配置文件路径为
%ProgramData%\ssh\ssh_config
默认情况下用户级 config 文件可能不存在,需手动创建。

config文件读取方式

SSH 客户端读取配置有固定优先级,首先读取通过ssh.exe -f 配置文件路径指定的配置文件;若未指定,则读取用户级的~/.ssh/config;最后读取系统级的%ProgramData%\ssh\ssh_config,优先级依次降低,高优先级配置会覆盖低优先级配置

config的配置

编码方式为UTF-8

编辑规则

  • 配置以Host为核心分组,一个Host对应一个远程服务器的配置;
  • 每行格式为参数名 参数值,参数名不区分大小写,但建议统一大写(规范);
  • 缩进仅为可读性,无语法要求;
  • #开头的行是注释,不会生效;
  • 配置优先级:Host *(全局配置) < 具体Host(如Host work) < 命令行参数(如ssh -p 2222)。

核心配置参数以及作用

参数名 核心作用 示例 / 说明
Host 自定义连接别名(核心标识) Host work-server:后续执行ssh work-server即可连接,无需输完整 IP / 端口
HostName 远程服务器的 IP 地址或域名 HostName 192.168.1.100/HostName ssh.example.com
User 登录远程服务器的用户名 User admin/User root
Port 远程服务器的 SSH 端口(默认 22) Port 2222:连接非默认 22 端口的服务器
IdentityFile 指定私钥文件路径(自定义密钥) IdentityFile D:\ssh_keys\work_rsa:使用该路径的私钥登录,替代默认id_rsa
ServerAliveInterval 心跳包间隔(防止连接超时) ServerAliveInterval 30:每 30 秒发送一次心跳包,保持连接不中断
ServerAliveCountMax 心跳包失败次数上限 ServerAliveCountMax 5:连续 5 次失败则断开连接(默认 3)
ForwardAgent 开启代理转发(多服务器免密) ForwardAgent yes:本地私钥可转发到远程服务器,方便从远程连其他服务器
StrictHostKeyChecking 控制服务器指纹验证 StrictHostKeyChecking no:首次连接不提示验证指纹(方便脚本执行,慎用)
UserKnownHostsFile 自定义known_hosts文件路径 UserKnownHostsFile D:\ssh\my_known_hosts:替代默认的~/.ssh/known_hosts
ProxyJump 跳板机 / 代理服务器配置 ProxyJump user@jump-server:22:先连跳板机,再连目标服务器(适用于内网服务器)

例如git配置

1
2
3
4
5
6
7
8
9
10
11
Host github.com
Hostname ssh.github.com
Port 443
User git
IdentityFile ~/.ssh/id_ed25519

Host github.repo2
Hostname ssh.github.com
Port 443
User git
IdentityFile ~/.ssh/id_ed25519.key

具体使用实例

以客户端和git服务器连接为例

本地生成

生成密钥

ssh-keygen -t ed25519 -f C:\Users\18875\.ssh\自定义密钥名称

多密钥配置

在.ssh文件夹下的config中配置
Host github.com 本地主机名可以自定义与后面建立远程仓库连接有关
Hostname ssh.github.com ssh地址
Port 443 端口
User git
IdentityFile ~/.ssh/blog_M_key 自定义使用的私钥

测试连接
ssh -T git@config中的主机名

连接存放公钥的仓库
git remote add origin git@github.repo2:your_username/your_reponame.git
origin:仓库名可以自定义
github.repo2: ssh config配置中对应的主机名

验证关联
git remote -v