当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 在 Windows 上配置 SSH 公钥身份验证

作者:精品下载站 日期:2024-12-14 23:26:26 浏览:14 分类:玩电脑

在 Windows 上配置 SSH 公钥身份验证


在本文中,我们将展示如何使用 RSA 或 EdDSA 密钥在 Windows 中配置 SSH 身份验证。让我们看看如何在 Windows 上生成公钥和私钥对,并在 Windows 10/11 或 Windows Server 2019/2022 上配置 OpenSSH 服务器以进行基于密钥的身份验证(无需密码)。

基于 SSH 密钥的身份验证在 Linux 世界中广泛使用,但在 Windows 中它最近才出现。这个想法是,客户端的公钥被添加到 SSH 服务器,当客户端尝试连接它时,服务器检查客户端是否拥有相应的私钥。这样,远程用户无需输入密码即可在 Windows 中进行身份验证。

在 Windows 上生成 SSH 密钥对

您必须在客户端计算机上生成两个 SSH 密钥(公钥和私钥),用于连接到运行 OpenSSH 的远程 Windows 主机。私钥存储在客户端(请妥善保管密钥,不要与任何人共享!),公钥添加到 SSH 服务器上的 authorized_keys 文件中。要在 Windows 客户端上生成 RSA 密钥,您必须安装 OpenSSH 客户端。

在 Windows 10/11 和 Windows Server 2019/2022 上,OpenSSH 客户端使用 PowerShell 作为可选 Windows 功能安装:

Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

在以前的 Windows 版本上,您可以从 GitHub 安装 Win32-OpenSSH 端口(请参阅有关在 Windows 上设置 SFTP (SSH FTP) 服务器的文章中的示例)。

打开标准(非提升的)PowerShell 会话并使用以下命令生成一对 ED25519 密钥:

ssh-keygen -t ed25519

默认情况下,ssh-keygen 工具生成 RSA 2048 密钥。目前,建议使用 ED25519 代替 RSA 密钥。

系统将提示您提供密码以保护私钥。如果指定密码,则每次使用此密钥进行 SSH 身份验证时都必须输入该密码。我没有输入密码(不推荐)。

[玩转系统] 在 Windows 上配置 SSH 公钥身份验证

Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\myuser/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\myuser/.ssh/id_ed25519.
Your public key has been saved in C:\Users\myuser/.ssh/id_ed25519.pub.
The key fingerprint is: SHA256:xxxxxxxx myuser@computername
The key's randomart image is:
+--[ED25519 256]--+
+----[SHA256]-----+

ssh-keygen 将在当前 Windows 用户的配置文件中创建 .ssh 目录(

%USERPROFILE%\.ssh

)并生成2个文件:

  • id_ed25519

    - 私钥(如果您生成了 RSA 密钥,该文件将被命名为

    id_rsa

  • id_ed25519.pub

    - 公钥(类似的 RSA 密钥称为

    id_rsa.pub

[玩转系统] 在 Windows 上配置 SSH 公钥身份验证

生成SSH密钥后,您可以将您的私钥添加到SSH Agent服务中,这样您可以方便地管理私钥并使用私钥进行身份验证。

SSH代理服务可以存储您的私钥并在当前用户的安全上下文中提供它们。运行 ssh-agent 服务并使用 PowerShell 服务管理命令将其配置为自动启动:

set-service ssh-agent StartupType ‘Automatic’
Start-Service ssh-agent

将您的私钥添加到 ssh-agent 数据库:

ssh-add "C:\Users\youruser\.ssh\id_ed25519"
Identity added: C:\Users\youruser\.ssh\id_ed25519 (youruser@computername)

[玩转系统] 在 Windows 上配置 SSH 公钥身份验证

或者如下:

ssh-add.exe $ENV:UserProfile\.ssh\id_rsa

OpenSSH:在 Windows 上使用公钥配置基于密钥的身份验证

现在您需要将 SSH 公钥复制到 SSH 服务器。本示例中的 SSH 服务器是安装并配置了 OpenSSH 服务的远程 Windows 11 计算机。

您可以查看完整指南“如何在 Windows 上配置 OpenSSH 服务器? ”。

id_ed25519.pub 文件复制到您将用于连接到 SSH 服务器的用户配置文件中的 .ssh 目录。例如,我的远程 Windows 11 设备上有一个 user1 帐户,因此我需要将密钥复制到 C:\Users\user1\.ssh uthorized_keys。

[玩转系统] 在 Windows 上配置 SSH 公钥身份验证

您可以使用 SCP 将公钥从客户端复制到 SSH 服务器:

scp C:\Users\youruser\.ssh\id_rsa.pub [email protected]:c:\users\admin\.ssh\authorized_keys

您可以将多个公钥添加到单个authorized_keys 文件中。

Windows 上的 OpenSSH 服务器默认禁用公钥身份验证。您可以在 sshd_config 中检查这一点。获取 OpenSSH 中允许的身份验证方法列表的最简单方法是使用以下 PowerShell 命令(Select-String 类似于 PowerShell 中的 grep):

cat "C:\ProgramData\ssh\sshd_config"| Select-String "Authentication"
#PubkeyAuthentication yes
#HostbasedAuthentication no
#HostbasedAuthentication
PasswordAuthentication yes
#GSSAPIAuthentication no

[玩转系统] 在 Windows 上配置 SSH 公钥身份验证

在此示例中,PubkeyAuthentication 行被注释掉,这意味着此身份验证方法已禁用。使用记事本打开 sshd_config 文件并取消注释该行:

Notepad C:\ProgramData\ssh\sshd_config
PubkeyAuthentication yes

[玩转系统] 在 Windows 上配置 SSH 公钥身份验证

此外,您还必须禁用 sshd_config 配置文件中的 StrictModes 选项。默认情况下,此模式处于启用状态,并且如果私钥和公钥未得到适当保护,则会阻止基于 SSH 密钥的身份验证。取消注释该行

#StrictModes yes

并将其更改为

StrictModes no

[玩转系统] 在 Windows 上配置 SSH 公钥身份验证

要使用本机 SSH 客户端连接到远程主机,请使用以下命令:

ssh (username)@(SSH server name or IP address)

例如:

ssh [email protected]

这意味着您想要连接到 user1 帐户下 IP 地址为 192.168.1.15 的远程 SSH 服务器。 SSH 代理服务将自动尝试使用您的私钥在远程主机上进行身份验证。

  • 如果您不想使用 ssh-agent 服务来管理 SSH 密钥,可以指定用于 SSH 身份验证的私钥文件的路径:

    ssh [email protected] -i "C:\Users\youuser\.ssh\id_ed25519"
  • 要使用 Active Directory 域中的用户帐户连接 SSH 主机,请使用以下格式:

    ssh [email protected]@192.168.1.15 -i <private_key_absolute_path>

[玩转系统] 在 Windows 上配置 SSH 公钥身份验证

首次连接时,需要将SSH服务器密钥的指纹添加到信任列表中。输入 yes -> Enter

The authenticity of host '192.168.1.15 (192.168.1.15)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

Windows OpenSSH 中使用 ETW 日志记录来存储 SSH 日志而不是纯文本文件。您可以在 Windows 事件查看器中检查基于 SSH 密钥的身份验证日志(应用程序和服务日志 -> OpenSSH -> 操作)。

如果使用私钥的 SSH 连接成功,OpenSSH 日志中将出现以下事件:

EventID 4
sshd: Accepted publickey for locadm from 192.168.15.20 port 55772 ssh2: ED25519 SHA256:xxxxxxx

[玩转系统] 在 Windows 上配置 SSH 公钥身份验证

如果您无法使用私钥连接到 SSH 服务器,并且系统仍然提示您输入密码,则您尝试连接的用户帐户可能是本地 Windows 管理员组的成员(组 SID 为

S-1-5-32-544

)。我们稍后再讨论。

[玩转系统] 在 Windows 上配置 SSH 公钥身份验证

在管理用户下使用 SSH 密钥登录 Windows

OpenSSH 对 Windows 上的管理员用户帐户使用特殊的基于密钥的身份验证设置。

您需要使用 C:\ProgramData\ssh\administrators_authorized_keys 文件而不是用户配置文件中的 authorized_keys 密钥。将您的公共 SSH 密钥添加到此文本文件中(出于安全原因,只有管理员组和系统组应有权读取此文件)。

[玩转系统] 在 Windows 上配置 SSH 公钥身份验证

您可以使用以下命令更改文件的 NTFS 权限:

  • icacls 工具:

    icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
  • 或使用 Get-Acl 和 Set-Acl PowerShell cmdlet:

    get-acl "$env:programdata\ssh\ssh_host_rsa_key" | set-acl "$env:programdata\ssh\administrators_authorized_keys"

[玩转系统] 在 Windows 上配置 SSH 公钥身份验证

此后,即使禁用 StrictModes,SSH 密钥身份验证也会起作用。

为了使用用户配置文件中的authorized_keys文件而不是将公钥信息移动到administrators_authorized_keys文件中,您可以注释掉OpenSSH配置文件(C:\ProgramData\ssh\sshd_config)中的一行。

#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

[玩转系统] 在 Windows 上配置 SSH 公钥身份验证

此外,您可以在 sshd_config 中禁用 SSH 密码登录:

PasswordAuthentication no

在 sshd_config 中进行更改后,不要忘记重新启动 sshd 服务。

restart-service sshd

如果你设置了PasswordAuthentication no,并且配置了不正确的SSH密钥认证,那么通过ssh连接时会出现错误:

[email protected]: Permission denied (publickey,keyboard-interactive).

[玩转系统] 在 Windows 上配置 SSH 公钥身份验证

您可以使用 Linux 上 OpenSSH 中的 PermitRootLogin 选项来限制 SSH root 登录。该指令不适用于 Windows OpenSSH,您必须使用 DenyGroups 参数拒绝管理员帐户下的 ssh 登录:

DenyGroups Administrators

因此,您已经使用密钥对在 Windows 中配置了 SSH 身份验证。现在,您可以使用此身份验证方法安全地访问远程服务器、自动转发 SSH 隧道中的端口、运行脚本以及执行其他自动化任务。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯