在客户端和服务器上使用公钥身份验证设置和验证 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 已释放
在客户端上创建私钥和公钥
登录到客户端。 私钥和公钥也可以由服务器端创建,但私钥由客户端创建,公钥由服务器拥有。 在客户端创建。
使用管理权限启动电源外壳。
创建文件后,使用 cd 命令导航到任何文件夹,然后键入以下命令:
ssh-keygen -t rsa -f id_rsa
密钥包含密码(密码),因此,如果需要,请输入密码。
如果密钥生成成功,将显示以下信息,并在文件夹中创建公钥和私钥: "id_rsa"是私钥,"id_rsa.pub"是公钥。
将公钥放在服务器上
使用 SFTP 帐户登录到服务器。
将创建的公钥"id_rsa.pub"放在服务器的以下文件夹中: 「. 如果没有 ssh 文件夹,请创建它。 此外,将文件名更改为"authorized_keys"。 (<>替换为使用 SFTP 登录的用户名。
- C:\users\<用户名>\.ssh
请注意,只有具有管理员权限或 SFTP 用户才能访问此文件。 如果其他用户具有访问权限,则 SFTP 连接始终失败。 例如,如果权限包含"用户"或"所有人"组,则为 NG。
对于此示例,请参阅。 ssh 文件夹的权限为"组:SYSTEM"、"组:管理员"和"用户:最自由"。 如果无法删除权限,请禁用权限继承。
在服务器上启用公钥身份验证
使用管理员权限的用户登录到服务器并打开以下文件夹:
- C:\ProgramData\ssh
由于存在名为"sshd_config"的文件,因此请复制该文件,将文件名更改为"sshd_config_default",然后进行备份。
在以管理权限启动的文本编辑器中打开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 服务器。
使用公钥身份验证从客户端发送和接收文件
将 SFTP 连接之前创建的私钥"id_rsa"放在只有运行 SFTP 的用户才能访问的文件夹中。 请注意,如果将其放在其他人可以访问的文件夹中,SFTP 连接将失败。 特别是,如果文件夹具有"用户"和"所有人"组的权限,则为 NG。
基本上,建议将其放在以下文件夹中,因为它会自动引用路径。
- C:\users\<用户名>\.ssh
客户"。 ssh 文件夹的权限为"组:SYSTEM"、"组:管理员"和"用户:<登录用户>"。
如果要使用私钥在 SFTP 中访问它,请输入以下命令(替换<>部分): 如果设置了密码短语,请键入密码短语。
sftp -i id_rsa <ユーザー名>@<サーバー名>
成功登录后,将切换到显示登录用户。
您还可以通过 dir 命令登录。
现在,您已经拥有了"test3.txt"文件,请使用 put 命令发送该文件。
put c:\temp\test3.txt
通过查看服务器端的"C:\用户\自由"文件夹,可以验证 test3.txt 文件是否已发送。
尝试从客户端获取。
get test3.txt c:\temp\test4.txt
我能够确认我已获取该文件。
总结
公钥身份验证允许 SFTP 发送和接收文件。 使用公钥可防止服务器端知道密码 与密码身份验证相比,文件交换更安全。