Аутентификация с помощью ключа PPK в SSH.NET

Я создаю оконный сервис для загрузки файлов с SFTP-сервера. Для этого я использую Renci.SshNet, Renci.SshNet.Common и Renci.SshNet.Sftp.

У меня есть такой код:

String Host = "HostName";
int Port = 22;
String RemoteFileDirectory =
    Convert.ToString(ConfigurationManager.AppSettings["SourcePath"]);
String Username = "UserName";
String Password = "*******";

var KeybasedMethod = new KeyboardInteractiveAuthenticationMethod(Username);
KeybasedMethod.AuthenticationPrompt +=
    (sender, e) => { e.Prompts.First().Response = password; };

AuthenticationMethod[] methods = new AuthenticationMethod[] 
{
    new PrivateKeyAuthenticationMethod(Username, new PrivateKeyFile(@"Z:\SFTP SETUP\CJ22")),
    KeybasedMethod
};
ConnectionInfo connectionInfo = new ConnectionInfo(hostname, username, methods);

using (var sftp = new SftpClient(connectionInfo))
{
    sftp.Connect();
    // ...
}

Я получаю исключение.

Неверный файл закрытого ключа.

Я не могу понять, чего мне не хватает в моем коде.

Ниже приведен файл журнала, который я получаю, когда вхожу на сервер со своей клиентской машины с помощью FileZilla.

2017-04-03 16:25:19 8120 3 Status: Connecting to abc.domainname.com... 
2017-04-03 16:25:19 8120 3 Trace: Going to execute "C:\Program Files\FileZilla FTP Client\fzsftp.exe" 
2017-04-03 16:25:19 8120 3 Response: fzSftp started 
2017-04-03 16:25:19 8120 3 Trace: CSftpControlSocket::ConnectParseResponse(fzSftp started) 
2017-04-03 16:25:19 8120 3 Trace: CSftpControlSocket::SendNextCommand() 
2017-04-03 16:25:19 8120 3 Trace: CSftpControlSocket::ConnectSend() 
2017-04-03 16:25:19 8120 3 Command: keyfile "Z:\SFTP SETUP\CJ21_PVT.ppk" 
2017-04-03 16:25:19 8120 3 Trace: CSftpControlSocket::ConnectParseResponse() 
2017-04-03 16:25:19 8120 3 Trace: CSftpControlSocket::SendNextCommand() 
2017-04-03 16:25:19 8120 3 Trace: CSftpControlSocket::ConnectSend() 
2017-04-03 16:25:19 8120 3 Command: keyfile "Z:\SFTP SETUP\CJ22_PVT.ppk" 
2017-04-03 16:25:19 8120 3 Trace: CSftpControlSocket::ConnectParseResponse() 
2017-04-03 16:25:19 8120 3 Trace: CSftpControlSocket::SendNextCommand() 
2017-04-03 16:25:19 8120 3 Trace: CSftpControlSocket::ConnectSend() 
2017-04-03 16:25:19 8120 3 Command: keyfile "Z:\SFTP SETUP\CJ24_PVT.ppk" 
2017-04-03 16:25:19 8120 3 Trace: CSftpControlSocket::ConnectParseResponse() 
2017-04-03 16:25:19 8120 3 Trace: CSftpControlSocket::SendNextCommand() 
2017-04-03 16:25:19 8120 3 Trace: CSftpControlSocket::ConnectSend() 
2017-04-03 16:25:19 8120 3 Command: keyfile "Z:\SFTP SETUP\CJ90_PVT.ppk" 
2017-04-03 16:25:19 8120 3 Trace: CSftpControlSocket::ConnectParseResponse() 
2017-04-03 16:25:19 8120 3 Trace: CSftpControlSocket::SendNextCommand() 
2017-04-03 16:25:19 8120 3 Trace: CSftpControlSocket::ConnectSend() 
2017-04-03 16:25:19 8120 3 Command: open "[email protected]" 22 
2017-04-03 16:25:19 8120 3 Trace: Looking up host "abc.domainname.com" 
2017-04-03 16:25:19 8120 3 Trace: Connecting to xxx.xxx.163.74 port 22 
2017-04-03 16:25:23 8120 3 Trace: Server version: SSH-2.0-1.82_sshlib Globalscape 
2017-04-03 16:25:23 8120 3 Trace: Using SSH protocol version 2 
2017-04-03 16:25:23 8120 3 Trace: We claim version: SSH-2.0-PuTTY_Local:_Mar_28_2014_10:34:48 
2017-04-03 16:25:24 8120 3 Trace: Doing Diffie-Hellman group exchange 
2017-04-03 16:25:24 8120 3 Trace: Doing Diffie-Hellman key exchange with hash SHA-1 
2017-04-03 16:25:25 8120 3 Trace: Host key fingerprint is: 
2017-04-03 16:25:25 8120 3 Trace: ssh-rsa 2048 6b:80:2c:5e:af:3f:2c:c7:f7:ef:4b:dd:85:55:32:fe 
2017-04-03 16:25:25 8120 3 Trace: Initialised AES-256 SDCTR client->server encryption 
2017-04-03 16:25:25 8120 3 Trace: Initialised HMAC-SHA1 client->server MAC algorithm 
2017-04-03 16:25:25 8120 3 Trace: Initialised AES-256 SDCTR server->client encryption 
2017-04-03 16:25:25 8120 3 Trace: Initialised HMAC-SHA1 server->client MAC algorithm 
2017-04-03 16:25:25 8120 3 Trace: Successfully loaded 4 key pairs from file 
2017-04-03 16:25:26 8120 3 Trace: Offered public key from "Z:\SFTP SETUP\CJ21_PVT.ppk" 
2017-04-03 16:25:26 8120 3 Trace: Server refused public key 
2017-04-03 16:25:26 8120 3 Trace: Offered public key from "Z:\SFTP SETUP\CJ22_PVT.ppk" 
2017-04-03 16:25:26 8120 3 Trace: Offer of public key accepted, trying to authenticate using it. 
2017-04-03 16:25:29 8120 3 Trace: Further authentication required 
2017-04-03 16:25:30 8120 3 Trace: Using keyboard-interactive authentication. inst_len: 0, num_prompts: 1 
2017-04-03 16:25:30 8120 3 Command: Pass: ********* 
2017-04-03 16:25:30 8120 3 Trace: Access granted 
2017-04-03 16:25:30 8120 3 Trace: Opened channel for session 
2017-04-03 16:25:31 8120 3 Trace: Started a shell/command 
2017-04-03 16:25:31 8120 3 Status: Connected to abc.domainname.com 
2017-04-03 16:25:33 8120 3 Trace: CSftpControlSocket::ConnectParseResponse() 
2017-04-03 16:25:33 8120 3 Trace: CSftpControlSocket::ResetOperation(0) 
2017-04-03 16:25:33 8120 3 Trace: CControlSocket::ResetOperation(0) 
2017-04-03 16:25:33 8120 3 Trace: CFileZillaEnginePrivate::ResetOperation(0) 
2017-04-03 16:25:33 8120 3 Status: Retrieving directory listing... 
2017-04-03 16:25:33 8120 3 Trace: CSftpControlSocket::SendNextCommand() 
2017-04-03 16:25:33 8120 3 Trace: CSftpControlSocket::ChangeDirSend() 
2017-04-03 16:25:33 8120 3 Command: cd "/" 
2017-04-03 16:25:34 8120 3 Response: New directory is: "/" 
2017-04-03 16:25:34 8120 3 Trace: CSftpControlSocket::ResetOperation(0) 
2017-04-03 16:25:34 8120 3 Trace: CControlSocket::ResetOperation(0) 
2017-04-03 16:25:34 8120 3 Trace: CSftpControlSocket::ParseSubcommandResult(0) 
2017-04-03 16:25:34 8120 3 Trace: CSftpControlSocket::ListSubcommandResult() 
2017-04-03 16:25:34 8120 3 Trace: state = 1 
2017-04-03 16:25:34 8120 3 Trace: CSftpControlSocket::SendNextCommand() 
2017-04-03 16:25:34 8120 3 Trace: CSftpControlSocket::ListSend() 
2017-04-03 16:25:34 8120 3 Trace: state = 2 
2017-04-03 16:25:34 8120 3 Command: ls 
2017-04-03 16:25:34 8120 3 Status: Listing directory / 
2017-04-03 16:25:36 8120 3 Listing: drwxrw-rw- 1 user group 0 Mar 24 2015 JKOB1 
2017-04-03 16:25:36 8120 3 Listing: drwxrw-rw- 1 user group 0 Apr 3 10:40 JKOB 
2017-04-03 16:25:36 8120 3 Trace: CSftpControlSocket::ListParseResponse() 
2017-04-03 16:25:36 8120 3 Trace: CSftpControlSocket::SendNextCommand() 
2017-04-03 16:25:36 8120 3 Trace: CSftpControlSocket::ListSend() 
2017-04-03 16:25:36 8120 3 Trace: state = 3 
2017-04-03 16:25:36 8120 3 Status: Calculating timezone offset of server... 
2017-04-03 16:25:36 8120 3 Command: mtime "JKOB" 
2017-04-03 16:25:37 8120 3 Response: 1491216040 
2017-04-03 16:25:37 8120 3 Trace: CSftpControlSocket::ListParseResponse(1491216040) 
2017-04-03 16:25:37 8120 3 Status: Timezone offsets: Server: 0 seconds. Local: 19800 seconds. Difference: 19800 seconds. 
2017-04-03 16:25:37 8120 3 Trace: CSftpControlSocket::ResetOperation(0) 
2017-04-03 16:25:37 8120 3 Trace: CControlSocket::ResetOperation(0) 
2017-04-03 16:25:37 8120 3 Status: Directory listing successful 
2017-04-03 16:25:37 8120 3 Trace: CFileZillaEnginePrivate::ResetOperation(0) 
2017-04-03 16:27:24 8120 3 Status: Disconnected from server 
2017-04-03 16:27:24 8120 3 Trace: CControlSocket::DoClose(64) 
2017-04-03 16:27:24 8120 3 Trace: CSftpControlSocket::ResetOperation(66) 
2017-04-03 16:27:24 8120 3 Trace: CControlSocket::ResetOperation(66) 
2017-04-03 16:27:24 8120 3 Trace: CFileZillaEnginePrivate::ResetOperation(66) 
2017-04-03 16:27:24 8120 3 Trace: CControlSocket::DoClose(64) 
2017-04-03 16:27:24 8120 3 Trace: CControlSocket::DoClose(64) 
2017-04-03 16:27:24 8120 3 Trace: CFileZillaEnginePrivate::ResetOperation(0)

Я пробовал несколько решений здесь и из других источников одно за другим, но ни одно из них не сработало. Если у вас есть какие-либо предложения, это более чем приветствуется.


person Chirag    schedule 03.04.2017    source источник


Ответы (1)


SSH.NET не поддерживает файлы ключей .ppk. Вы должны использовать PuTTYgen для преобразования ключа .ppk в формат OpenSSH.

См. Как преобразовать пары ключей SSH, созданные с помощью PuTTYgen (Windows), в пары ключей, используемые ssh-agent и Keychain (Linux) .


Исходный ответ до редактирования вопроса:

Вы используете многофакторный закрытый ключ и интерактивную аутентификацию с клавиатуры в FileZilla:

2017-04-03 16:25:26 8120 3 Трассировка: Предлагаемый открытый ключ из "Z: \ SFTP SETUP \ CJ22_PVT.ppk"
2017-04-03 16:25:26 8120 3 Трассировка: Предложение открытого ключа принято, пытается пройти аутентификацию с его помощью.
2017-04-03 16:25:29 8120 3 Trace: Требуется дополнительная аутентификация
2017-04-03 16:25:30 8120 3 Trace: Использование интерактивной аутентификации с клавиатуры . inst_len: 0, num_prompts: 1
2017-04-03 16:25:30 8120 3 Команда: Pass: *********
2017-04-03 16:25:30 8120 3 Trace: доступ предоставлен

В то время как вы используете в своем коде простую аутентификацию по паролю:

using (var sftp = new SftpClient(Host, Port, Username, Password))

Как вы вообще можете ожидать, что это сработает?


Чтобы реализовать многофакторную аутентификацию, вы должны использовать ConnectionInfo.

var keybInterMethod = new KeyboardInteractiveAuthenticationMethod(username);
keybInterMethod.AuthenticationPrompt +=
    (sender, e) => { e.Prompts.First().Response = password; };

AuthenticationMethod[] methods = new AuthenticationMethod[] {
    new PrivateKeyAuthenticationMethod(username, new PrivateKeyFile(privateKey)),
    keybInterMethod
};
ConnectionInfo connectionInfo = new ConnectionInfo(hostname, username, methods);

using (var sftp = new SftpClient(connectionInfo))
{
    sftp.Connect();

    // ...
}
person Martin Prikryl    schedule 03.04.2017