在运行Windows 8.1时,我遇到了“服务器拒绝了我们的密钥”问题。按照指南:
https://winscp.net/eng/docs/guide_windows_openssh_server,使用Windows登录的
用户名
和
密码
很容易建立连接。然而,当使用
私钥
与
用户名
进行身份验证时,响应是
服务器拒绝了我们的密钥
。使其能够使用公钥工作取决于文件
权限:C:\ProgramData\ssh\administrators_authorized_keys
。这是一个有用的页面:
https://github.com/PowerShell/Win32-OpenSSH/wiki/Troubleshooting-Steps。
停止两个OpenSSH服务,然后使用管理员权限打开一个命令提示符。然后运行:
C:\OpenSSH-Win32>c:\OpenSSH-Win32\sshd.exe -ddd
注意:必须指定exe的完整路径,否则sshd会报错。这将创建一个一次性使用的连接监听器。-ddd是详细级别3。
连接后,扫描日志可发现:
debug1: trying public key file __PROGRAMDATA__/ssh/administrators_authorized_keys
debug3: Failed to open file:C:/ProgramData/ssh/administrators_authorized_keys error:2
debug1: Could not open authorized keys '__PROGRAMDATA__/ssh/administrators_authorized_keys':
No such file or directory
需要创建文件:C:\ProgramData\ssh\administrators_authorized_keys
,并将public key
文本复制到其中,例如:ssh-rsa AAAA................MmpfXUCj rsa-key-20190505
,然后保存文件。我将文件保存为UTF-8
带BOM
的格式。没有测试ANSI
。
然后再次运行一次性命令行,在日志中显示:
debug1: trying public key file __PROGRAMDATA__/ssh/administrators_authorized_keys
debug3: Bad permissions. Try removing permissions for user: S-1-5-11 on file C:/ProgramData/ssh/administrators_authorized_keys.
Authentication refused.
S-1-5-11
是赋予System
的名称。
为了解决Bad permissions
问题,请右键单击administrators_authorized_keys
文件,进入Security Tab
,点击Advanced
按钮并删除继承的权限。
然后删除所有Group or user names:
,除了Windows登录用户名,例如:YourMachineName\username
该username
的权限应为Read Allow
,Write Deny
,其他都不选中。文件的所有者也应为YourMachineName\username
这样就解决了问题。
其他有用的链接:
从https://github.com/PowerShell/Win32-OpenSSH/releases下载OpenSSH-Win32.zip
以下是使用WinSCPnet.dll连接到OpenSSH服务器的C#示例代码:
https://winscp.net/eng/docs/library#csharp
以下是使用WinSCPnet.dll进行连接的代码片段:
WinSCPnet.dll
:
static void WinSCPTest() {
SessionOptions ops = new SessionOptions {
Protocol = Protocol.Sftp,
PortNumber = 22,
HostName = "192.168.1.188",
UserName = "user123",
//Password = "Password1",
SshHostKeyFingerprint = @"ssh-rsa 2048 qu0f........................ddowUUXA="
};
ops.SshPrivateKeyPath = @"C:\temp\rsa-key-20190505.ppk";
using (Session session = new Session()) {
session.Open(ops);
MessageBox.Show("success");
}
}
请用您自己的值替换
SshHostKeyFingerprint
和
SshPrivateKeyPath
。
编辑:添加管理员授权密钥文件权限截图:
![enter image description here](https://istack.dev59.com/0Wxyj.webp)
当
OpenSSH SSH Server
作为服务运行时,只有
System
应该拥有权限。但是,如果从命令提示符中运行
sshd.exe
,则当前用户应该是唯一列出的用户(读取允许,写入拒绝)。