Как я могу создать приемлемый файл закрытого ключа для сборки WinSCP для аутентификации?

Я пытаюсь использовать сборку WinSCP для загрузки на наш FTP-сервер. У нас есть общий закрытый ключ, хранящийся в нашей БД, который мы извлекаем и используем для аутентификации (в настоящее время он работает для нашей загрузки Java с помощью JSch). Однако WinSCP требуется имя пути к файлу.

Я пытаюсь записать наш закрытый ключ в файл, который WinSCP использует для аутентификации, но получаю следующую ошибку:

"C:\[..path..].\key.txt (не распознанный формат файла ключа)"

Загрузить код:

String host = token.hostName;
String user = token.userID;
String sshKey = token.sshKey;

//write key to temp file
String keyFile = AppDomain.CurrentDomain.BaseDirectory+@".\key.txt";
FileStream temp = new FileStream(keyFile, FileMode.Create);
temp.Write(Encoding.ASCII.GetBytes(sshKey), 0 , 0);
temp.Close();

try {
    // Setup session options
    SessionOptions sessionOptions = new SessionOptions {
        Protocol = Protocol.Sftp,
        HostName = host,
        UserName = user,
        SshPrivateKeyPath = keyFile,
        GiveUpSecurityAndAcceptAnySshHostKey = true
    };

    using (Session session = new Session()) {
        // Connect
        session.Open(sessionOptions);
        session.DisableVersionCheck = true;

        // Upload files
        TransferOptions transferOptions = new TransferOptions();
        transferOptions.TransferMode = TransferMode.Binary;

        TransferOperationResult transferResult;
        transferResult = session.PutFiles(@resultsFolder+"*", depthDir, false, transferOptions);

        // Throw on any error
        transferResult.Check();

        // Print results
        foreach (TransferEventArgs transfer in transferResult.Transfers) {
            Console.WriteLine("Upload of {0} succeeded", transfer.FileName);
        }
    }               
} catch (Exception e) {
    Console.WriteLine("Error: {0}", e);
} finally {
    // delete file with key
    File.Delete(keyFile);
}

person Fueled By Coffee    schedule 15.06.2018    source источник
comment
Могу ли я предположить, что вы хотите прочитать содержимое файла?   -  person Simon Price    schedule 15.06.2018
comment
Какой формат у вашего key.txt? Показать нам.   -  person Martin Prikryl    schedule 15.06.2018
comment
key.txt — это просто длинная строка символов (закрытый ключ)   -  person Fueled By Coffee    schedule 15.06.2018
comment
Покажите нам, как вы используете ключевой файл в JSch.   -  person Martin Prikryl    schedule 15.06.2018


Ответы (2)


Немного поздно, но ваш код winscp работает. Мне просто нужно было преобразовать мой закрытый ключ в стандарт PuTTY. Для этого просто преобразуйте свой ключ, используя

winscp.exe /keygen oldformat.key /output=newformat.key

Вы можете использовать PuTTY, но мне показалось, что winscp намного проще, так как он у вас уже есть.

person JerryTheGreek    schedule 18.09.2019

Если я правильно предполагаю, вам нужно будет настроить свой код из этого

String keyFile = AppDomain.CurrentDomain.BaseDirectory+@".\key.txt";

к этому

var keyFilePath = $"{AppDomain.CurrentDomain.BaseDirectory} \\key.txt";
var keyText = File.ReadAllText(keyFilePath);

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

person Simon Price    schedule 15.06.2018
comment
Я не думаю, что ваше изменение приводит к чему-либо, кроме требования новой версии C# - вы удалили лишнее . (что могло бы быть безвредным, если бы BaseDirectory заканчивалось косой чертой) и вставили лишнее пространство (что небезопасно). - person Ben Voigt; 18.09.2019