如何为WinSCP程序集创建可接受的私钥文件以进行身份​​验证?

时间:2018-06-15 18:04:56

标签: c# private-key winscp winscp-net

我尝试使用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);
}

2 个答案:

答案 0 :(得分:1)

有点晚了,但是您的winscp代码有效。我只需要将我的私钥转换为PuTTY标准即可。为此,只需使用

即可转换您的密钥

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

您可以使用PuTTY,但是我发现winscp更加简单,因为您已经拥有它。

答案 1 :(得分:0)

如果我假设正确,您需要从此

调整代码
String keyFile = AppDomain.CurrentDomain.BaseDirectory+@".\key.txt";

到这个

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

我已将它分成两个变量,以便您清楚地了解,但您可以在一行中完成所有操作。