Windows上使用ssh服务以及坑

Windows上提供了openssh客户端和openssh服务端。需要先安装,需要ssh客户端(即ssh.exe命令)就安装openssh客户端,需要提供ssh服务(即sshd功能),就安装openssh服务端。当然,可以都装上。

安装前,需要确保Windows Update服务是打开的状态。

openssh客户端

安装好openssh客户端之后,就可以使用ssh.exe命令。它会读取用户目录下的.ssh目录下的配置文件%userprofile%\.ssh\config

ssh.exe命令我使用不多,我主要使用wsl里的ssh命令。

openssh服务端

虽然Windows提供sshd服务,但是想要正常使用,还需额外配置。

Windows上安装完openssh服务端后,如下事项须知:

  • 安装openssh服务端之后,sshd的配置文件路径为C:\ProgramData\ssh\sshd_config,等价于Linux上的/etc/ssh/sshd_config
  • 安装Openssh服务端之后,会提供一个名为OpenSSH SSH Server的服务(真实服务名为sshd)。要想使用ssh服务端,需要启动该服务,并且每次修改完sshd的配置文件后,都要重启sshd服务使新配置生效。
  • 其它主机上使用ssh连接Windows的ssh服务时,主机认证和用户认证过程的密钥路径分别为:%userprofile%\.ssh\known_hosts%userprofile%\.ssh\authorized_keys

启动OpenSSH SSH Server服务后,就可以在其它主机上通过ssh和密码验证的方式连接到Windows了。

Windows OpenSSH服务无法通过公钥认证的解决方案

虽然安装OpenSSH服务端并启动OpenSSH SSH Server服务之后,就能通过密码认证的方式连接到Windows上了,但想要通过公钥认证方式进行连接将会失败。解决方法看最后面的总结

想要通过公钥认证方式连接Windows,首先要将公钥分发到Windows。

如果通过ssh-copy-id发送公钥想要通过公钥方式连接Windows SSH服务会出现异常,即使执行了ssh-copy-id之后再使用ssh命令进行连接也仍然无法公钥认证,而是让你继续用密码认证。

例如,我在远程主机Linux上使用该命令将公钥id_rsa.pub发送到Windows主机(192.168.200.1)的malong用户上:

1
ssh-copy-id -i ~/.ssh/id_rsa.pub malong@192.168.200.1

但是随后执行ssh malong@192.168.200.1仍然会提示使用密码。

原因在于ssh-copy-id想要添加公钥到C:\Users\malong\.ssh\authorized_keys文件中,会出现错乱或者乱七八糟的字符: }甚至完全没任何内容写入。

所以,需要手动拷贝公钥内容到C:\Users\malong\.ssh\authorized_keys文件中

即使已经手动拷贝公钥到C:\Users\malong\.ssh\authorized_keys之后,ssh可能也依然无法使用公钥连接。原因在于Windows Openssh服务的配置文件C:\ProgramData\ssh\sshd_config中存在如下两行:

1
2
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

这两行的作用是:

  • 如果远程主机连接的是Windows上的管理员用户(加入了管理员组的用户),默认会使用C:\Users\Administrator\.ssh\authorized_keys中的公钥来做用户身份验证。
  • 如果远程主机连接的是非管理员用户,则使用该用户目录下的文件%userprofile%\.ssh\authorized_keys中的公钥来做身份验证。

例如,ssh malong@192.168.200.1时,malong是一个管理员账户,即便已经手动将公钥写入C:\Users\malong\.ssh\authorized_keys中,也依然会通过C:\Users\Administrator\.ssh\authorized_keys来做身份认证,因此公钥认证会失败。

解决办法有二:

  • 将公钥写入到C:\Users\Administrator\.ssh\authorized_keys
  • 将配置文件C:\ProgramData\ssh\sshd_config中的那两行注释掉,再重启OpenSSH SSH Server服务

因此,最终解决方案的总结是:

  • 如果连接的是Windows上的非管理员用户,则手动拷贝公钥到%userprofile%\.ssh\authorized_keys文件即可

  • 如果连接的是Windows上的管理员用户,则两种方式任选其一:

    • 1.将公钥拷贝到C:\Users\Administrator\.ssh\authorized_keys
    • 2.将公钥拷贝到%userprofile%\.ssh\authorized_keys,然后修改sshd配置文件C:\ProgramData\ssh\sshd_config(如何修改看上面),并重启OpenSSH SSH Server服务