Al ejecutar Windows 8.1 me encontré con el server refused our keyproblema.
Siguiendo la guía: https://winscp.net/eng/docs/guide_windows_openssh_server
Fue fácil establecer una conexión usando el inicio de sesión de Windows usernamey password. Sin embargo, al autenticarse con el usernameen combinación con a private key, la respuesta fue server refused our key.
Hacer que funcione con una clave pública se redujo a los permisos en el archivo:
C:\ProgramData\ssh\administrators_authorized_keys
Esta es una página útil: https://github.com/PowerShell/Win32-OpenSSH/wiki/Troubleshooting-Steps
Detenga los dos servicios OpenSSH, luego abra un command promptcon admin permissions. Entonces corre:
C:\OpenSSH-Win32>c:\OpenSSH-Win32\sshd.exe -ddd
Nota: especifique la ruta completa al exe, de lo contrario se sshdqueja. Esto crea un escucha de conexión de un solo uso. El -dddes el nivel 3 detallado.
Después de realizar una conexión, el escaneo de los registros reveló:
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
Tuve que crear el archivo: C:\ProgramData\ssh\administrators_authorized_keys
Y copiar el public keytexto en él, por ejemplo: ssh-rsa AAAA................MmpfXUCj rsa-key-20190505
Y luego guardar el archivo. Guardé el archivo como UTF-8con el BOM. No probé ANSI.
Luego, ejecutando la línea de comando de una sola vez nuevamente, en los registros se muestra:
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-11es el nombre que se le da al System.
Para arreglar el Bad permissions, haga clic derecho en el administrators_authorized_keysarchivo, vaya al Security Tab, haga clic en el Advancedbotón y elimine los permisos heredados. Luego elimine todo Group or user names:excepto el nombre de usuario de inicio de sesión de Windows, por ejemplo: YourMachineName\username
Los permisos para eso usernamedeberían ser Read Allow, Write Denytodo lo demás está desmarcado. El propietario del archivo también debe serYourMachineName\username
Esto solucionó el problema.
Otros enlaces útiles:
Descargue OpenSSH-Win32.zip desde: https://github.com/PowerShell/Win32-OpenSSH/releases
Ejemplo de C # de cómo utilizar WinSCPnet.dll para establecer una conexión con el servidor OpenSSH: https://winscp.net/eng/docs/library#csharp
Aquí está el fragmento de código para hacer una conexión usando 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");
}
}
Reemplazar SshHostKeyFingerprinty SshPrivateKeyPathcon sus propios valores.
Editar: captura de pantalla agregada de los permisos de archivo administrator_authorized_keys:

Cuando OpenSSH SSH Serverse ejecuta como un servicio, solo Systemdebe tener permiso. Sin embargo, si se ejecuta sshd.exedesde el símbolo del sistema, el usuario actual debe ser el único en la lista (leer permitir, escribir denegar).