问题
测试服务器是Windows Server 2012, 测试客户端机器是Windows 10(系统自带SSH)。
尝试过 OpenSSH for windows 和 FreeSSHD 均有问题,前者服务无法启动,后者客户端连接乱码,最终选用 Win32-OpenSSH。
实施
1. 安装SSH服务
- 从 这里 下载最新的发布版本
- 解压到服务器的
C:\Program Files\OpenSSH
目录。
确认该目录的写入权限只分配给SYSTEM
和Administrator
,其他用户只有读取和执行权限。 - 使用管理员打开
PowerShell
,跳转到刚才解压得目录,执行下面的命令:
powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
2. 防火墙端口设置
执行,开放防火墙22端口给SSH
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
注意: New-NetFirewallRule 只在Windows Server 2012 或者更高版本上有效,如果是客户端的Windows 或者 Windows 2008 R2 或者更低的服务器版本,执行
netsh advfirewall firewall add rule name=sshd dir=in action=allow protocol=TCP localport=22
3. 启动SSHD服务
执行net start sshd
启动服务
启动后会自动创建
%programdata%\ssh
文件夹,包含有服务器相关的配置,修改配置后需要重启SSHD服务
4. SSH服务登录认证
客户端登录SSH服务器常用两种方式: 密码认证,公钥认证。
4.1 密码认证
客户端机器执行 ssh <username>@<host>
,回车后会要求输入密码
- username: 服务器上的用户名
- host:服务器地址或者域名
4.2 公钥认证
-
客户端生成访问公钥
客户端执行ssh-keygen -t rsa
,根据提示设置密码,过程如下图,
完成后就会在C:\Users\Administrator/.ssh/id_rsa
看到id_rsa.pub
就是公钥
-
拷贝公钥到服务器
用记事本打开服务器的C:\Users\<服务器用户名>/.ssh/authorized_keys
(如果文件和文件夹不存在,则创建),粘贴刚才客户端生成的id_rsa.pub
到文件最后。 -
客户端连接
ssh <服务器主机>
根据提示输入上面设置的密码,即可正常登陆。
4.2.1 额外的配置
客户端每次连接都需要输入密码,挺麻烦的,下面使用 ssh-agent
保存密码。
ssh-agen add <id_rsa文件>
问题解答
无法使用公钥认证
在使用中发现配置文件中默认的密钥路径有错误。
打开服务器%programdata%\ssh\sshd_config
,找到如下一行
AuthorizedKeysFile .ssh/authorized_keys
修改为
AuthorizedKeysFile C:\Users\<服务器用户名>/.ssh/authorized_keys
重启SSHD服务即可