产品中需要用到sftp,sftp实际上就是ssh的一部分,ssh在Linux系统中是自带的,运行sshd之后就同时也支持sftp了,也是通过22端口连接。但我们的产品需要支持跨平台,需要同时支持Linux和Windows,因此需要寻找一个跨平台的ssh实现,通过寻找发现实际上在Win10 1809和Windows Server 2019开始已经内置了,使用的正是OpenSSH。
OpenSSH
OpenSSH是ssh协议的开源实现,是OpenBSD的子项目。
OpenSSH套件包含以下工具:
-
远程操作使用ssh、scp和sftp完成。
-
使用ssh-add、ssh-keysign、ssh-keyscan和ssh-keygen进行密钥管理。
-
服务端由sshd、sftp服务器和ssh代理组成。
源码:https://github.com/openssh/openssh-portable
Windows安装
Windows官方将OpenSSH移植到Windows下,源码:https://github.com/PowerShell/openssh-portable,可以从上述源码构建安装,如果你使用的Win10 1809或Windows Server 2019,也可以通过Windows可选程序安装,以Window 10 1903为例:
- 在“应用和功能”中点击"可选功能"
- 点击"添加功能"
- 点击”OpenSSH 服务器“,然后点击“安装”,稍等片刻后就安装成功了
-
安装后程序位于:C:\Windows\System32\OpenSSH
Win10 1903使用的7.7.2.1版本。
-
启动服务,命令行执行如下命令
1
net start sshd
OpenSSH配置
配置文件
%PROGRAMDATA%\ssh\sshd_config
默认是密码认证和公钥认证都开启的,也可以修改上述文件进行控制:
1 | PubkeyAuthentication yes |
密码登录
使用Windows账户密码登陆。
1 | ssh user@host |
公钥登陆
- 客户端
-
创建密钥和公钥
1
ssh-keygen -t rsa -f myssh
运行上述命令后在%USERPROFILE%\.ssh下生成myssh和myssh.pub文件,前者是密钥,后者为公钥。
-
向ssh代理注册私钥
1
2net start ssh-agent
ssh-add myssh
- 服务端
-
创建%USERPROFILE%\.ssh\authorized_keys文件,将上述客户机myssh.pub的内容拷贝到其中,检查authorized_keys文件权修改,确保只有System, Administrators and owner可以访问
1
icacls %USERPROFILE%\.ssh\authorized_keys
-
如果登陆用户属于administrators组,还需要创建%PROGRAMDATA%\ssh\administrators_authorized_keys文件,同样拷贝客户机myssh.pub的内容拷贝到其中,这个文件只能SYSTEM和Administrators组访问,可以执行:
1
2
3icacls administrators_authorized_keys /inheritance:r
icacls administrators_authorized_keys /grant SYSTEM:`(F`)
icacls administrators_authorized_keys /grant BUILTIN\Administrators:`(F`) -
重启sshd服务
1
2net stop sshd
net start sshd
- 客户端登陆
1 | ssh -i %USERPROFILE%\.ssh\myssh user@host |
使用putty访问
putty是常用的ssh客户端工具,功能更加丰富,使用密钥登陆需要生成putty的密钥格式。
运行puttygen.exe,点击Load,载入上述客户机密钥文件%USERPROFILE%\.ssh\myssh,然后点击Save private key,假设保存为C:\myssh.ppk。
然后在putty中就可以用上述ppk文件进行登陆认证。