Windows&Linux SSH免密公钥登录

通常情况下,使用SSH进行远程连接时使用密钥登录能够保障安全性,同时能够避免每次连接都输入密码。本文总结了Windows/Linux主机间建立SSH免密公钥登录的三种情况。

免密公钥登录的原理

  1. 客户端向服务器发起 SSH 登录请求。
  2. 服务器收到用户的SSH 登录请求,发送随机字符串给用户,要求用户证明自己的身份。
  3. 客户端收到服务器发来的数据,使用私钥对数据进行签名加密,然后再发送给服务器。
  4. 服务器收到客户端发来的加密签名后,使用本地保存的对应公钥进行解密,然后跟原始字符串比较。如果一致,就允许用户登录。

Windows to Windows SSH

1. OpenSSH客户端/服务器安装

以管理员权限启动PowerShell,输入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查询是否安装
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
# 安装OpenSSH客户端
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
# 安装OpenSSH服务端
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
# 卸载
Remove-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 / OpenSSH.Client~~~~0.0.1.0
# 设置开机自启
Set-Service -Name sshd -StartupType 'Automatic'
Set-Service -Name ssh-agent -StartupType 'Automatic'
# 启动服务
Start-Service sshd
Start-Service ssh-agent

2. 本地生成密钥并上传公钥

本机密钥默认生成在C:\Users\LOCAL_username\.ssh\文件夹下,例如以RSA类型会生成公钥id_rsa.pub和私钥id_rsa,其中公钥需要上传到服务器的C:\Users\REMOTE_username\.ssh\authorized_keys文件夹(可能需要mkdir)中:

1
2
3
4
# 生成RSA密钥,-b 指定二进制位数 -f 指定文件路径
ssh-keygen -t rsa -b 4096
# 拷贝公钥到远端
scp C:/Users/LOCAL_username/.ssh/id_rsa.pub REMOTE_username@REMOTE_IP:C:/Users/REMOTE_username/.ssh/authorized_keys

3. 远端服务器ssh配置

使用icacls命令,为远端服务器上的authorized_keys文件配置正确的权限,其对应操作含义分别为移除不必要的继承权限、授予管理员用户完全控制权限、授予 SYSTEM 用户的完全控制权限,以确保服务可以访问。

1
2
# 在服务器端修改authorized_keys文件权限
icacls.exe "C:\Users\REMOTE_username\.ssh\authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"

在Windows OpenSSH中,默认的授权密钥存放位置为C:\ProgramData\ssh\administrators_authorized_keys,此位置对应管理员组权限。通常Windows用户属于该组,因此需要修改默认授权文件位置,需要编辑服务器配置文件C:\ProgramData\ssh\sshd_config,其中C:\ProgramData为隐藏文件夹,需要开启资源管理器的隐藏文件夹显示,或是直接将上述路径输入到搜索导航栏中。sshd_config文件中进行以下修改:

1
2
3
4
5
6
7
8
9
# 注释以下内容,覆盖默认路径
# Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
# 取消注释以下内容,添加新路径
AuthorizedKeysFile .ssh/authorized_keys
# 取消注释以下内容,允许公钥登录
PubkeyAuthentication yes
# 取消注释以下内容,禁止密码登录(可选)
PasswordAuthentication no

然后重启sshd服务:

1
Restart-Service sshd

Windows to Linux SSH

主要流程相似,包括生成密钥、上传公钥、修改sshd配置文件,注意Linux文件系统与Windows有区别,Linux系统配置文件在/etc/ssh/sshd_config目录下,授权密钥文件在/home/USERNAME/.ssh目录下。

可通过以下操作修改authorized_keys权限:

1
chmod 644 ~/.ssh/authorized_keys

Linux环境下,重启sshd服务:

1
service sshd restart

Linux to Linux SSH

主要流程相似,包括生成密钥、上传公钥、修改sshd配置文件,注意Linux文件系统与Windows有区别,Linux系统密钥对文件在/home/USERNAME/.ssh文件目录下。

另外,可以使用ssh-copy-id简化公钥拷贝流程:

1
2
# 等价于 cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'cat >> ~/.ssh/authorized_keys'
ssh-copy-id -i file_path USERNAME@IP

Windows&Linux SSH免密公钥登录
https://www.miaoer.icu/Windows&Linux-SSH免密公钥登录/
许可协议