在客户端和服务器上使用公钥身份验证设置和验证 SFTP 的行为

页面创建日期 :

环境

Windows
  • Windows 10 Pro
  • Windows Server 2019
  • Windows 7
  • Windows Server 2012 R2
OpenSSH
  • 7.7p1
  • 8.1p1 - Beta

* 它适用于其他版本,但尚未确认

入门

上次,我们设置了 SFTP 服务器,以确保密码身份验证可以发送和接收文件。 这一次,我们将使用公钥身份验证通过 SFTP 发送和接收文件。

提前准备

  • 客户端上安装了 OpenSSH 客户端
  • 服务器上安装了 OpenSSH 服务器
  • 服务器已启动 OpenSSH 服务,并且端口 22 已释放

在客户端上创建私钥和公钥

登录到客户端。 私钥和公钥也可以由服务器端创建,但私钥由客户端创建,公钥由服务器拥有。 在客户端创建。

使用管理权限启动电源外壳。

image

创建文件后,使用 cd 命令导航到任何文件夹,然后键入以下命令:

ssh-keygen -t rsa -f id_rsa

密钥包含密码(密码),因此,如果需要,请输入密码。

image

如果密钥生成成功,将显示以下信息,并在文件夹中创建公钥和私钥: "id_rsa"是私钥,"id_rsa.pub"是公钥。

image

image

将公钥放在服务器上

使用 SFTP 帐户登录到服务器。

将创建的公钥"id_rsa.pub"放在服务器的以下文件夹中: 「. 如果没有 ssh 文件夹,请创建它。 此外,将文件名更改为"authorized_keys"。 (<>替换为使用 SFTP 登录的用户名。

  • C:\users\<用户名>\.ssh

image

请注意,只有具有管理员权限或 SFTP 用户才能访问此文件。 如果其他用户具有访问权限,则 SFTP 连接始终失败。 例如,如果权限包含"用户"或"所有人"组,则为 NG。

对于此示例,请参阅。 ssh 文件夹的权限为"组:SYSTEM"、"组:管理员"和"用户:最自由"。 如果无法删除权限,请禁用权限继承。

在服务器上启用公钥身份验证

使用管理员权限的用户登录到服务器并打开以下文件夹:

  • C:\ProgramData\ssh

由于存在名为"sshd_config"的文件,因此请复制该文件,将文件名更改为"sshd_config_default",然后进行备份。

image

在以管理权限启动的文本编辑器中打开sshd_config。

要启用公钥身份验证,请更改以下功能:

#PubkeyAuthentication yes

↓↓↓

PubkeyAuthentication yes

此外,默认情况下启用密码身份验证,因此,如果要禁用密码身份验证,请更改以下设置:

#PasswordAuthentication yes

↓↓↓

PasswordAuthentication no

我想为每个 SFTP 帐户放置公钥,因此请注释掉以下行:

Match Group administrators
       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

↓↓↓

#Match Group administrators
#       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

如果要为每个 SFTP 帐户指定根目录,请添加以下行: 如果从客户端指定文件夹路径,则指定或不指定文件夹路径时,可能会更改为"C:\xxxxxx"或"/xxxxxx"格式。

Match User <ユーザー名>
       ChrootDirectory <フォルダパス>

示例

Match User TestUser
       ChrootDirectory C:\Users\TestUser

保存"sshd_config"后,重新启动 OpenSSH 服务器。

image

使用公钥身份验证从客户端发送和接收文件

将 SFTP 连接之前创建的私钥"id_rsa"放在只有运行 SFTP 的用户才能访问的文件夹中。 请注意,如果将其放在其他人可以访问的文件夹中,SFTP 连接将失败。 特别是,如果文件夹具有"用户"和"所有人"组的权限,则为 NG。

基本上,建议将其放在以下文件夹中,因为它会自动引用路径。

  • C:\users\<用户名>\.ssh

客户"。 ssh 文件夹的权限为"组:SYSTEM"、"组:管理员"和"用户:<登录用户>"。

如果要使用私钥在 SFTP 中访问它,请输入以下命令(替换<>部分): 如果设置了密码短语,请键入密码短语。

sftp -i id_rsa <ユーザー名>@<サーバー名>

image

成功登录后,将切换到显示登录用户。

image

您还可以通过 dir 命令登录。

image

现在,您已经拥有了"test3.txt"文件,请使用 put 命令发送该文件。

put c:\temp\test3.txt

image

通过查看服务器端的"C:\用户\自由"文件夹,可以验证 test3.txt 文件是否已发送。

image

尝试从客户端获取。

get test3.txt c:\temp\test4.txt

image

我能够确认我已获取该文件。

image

总结

公钥身份验证允许 SFTP 发送和接收文件。 使用公钥可防止服务器端知道密码 与密码身份验证相比,文件交换更安全。