Skip to content

Unable to connect to a server using 2024.2.0: Key exchange negotiation failed #1617

Open
@nkoudelia

Description

@nkoudelia

Unable to connect to a server when using SSH.NET 2024.2.0 and base64-encoded ed25519 private key. Version 2024.1.0 works fine.

This is the exception I'm getting:

Renci.SshNet.Common.SshConnectionException: Key exchange negotiation failed.
   at Renci.SshNet.Security.KeyExchange.Finish()
   at Renci.SshNet.Security.KeyExchangeECCurve25519.Finish()
   at Renci.SshNet.Security.KeyExchangeECCurve25519.Session_KeyExchangeEcdhReplyMessageReceived(Object sender, MessageEventArgs`1 e)
   at Renci.SshNet.Session.OnKeyExchangeEcdhReplyMessageReceived(KeyExchangeEcdhReplyMessage message)
   at Renci.SshNet.Messages.Transport.KeyExchangeEcdhReplyMessage.Process(Session session)
   at Renci.SshNet.Session.MessageListener()
--- End of stack trace from previous location ---
   at Renci.SshNet.Session.WaitOnHandle(WaitHandle waitHandle, TimeSpan timeout)
   at Renci.SshNet.Session.WaitOnHandle(WaitHandle waitHandle)
   at Renci.SshNet.Session.Connect()
   at Renci.SshNet.BaseClient.CreateAndConnectSession()
   at Renci.SshNet.BaseClient.Connect()
   at FSI_0002.main(String host, String user, String dir) in /home/vmadmin/temp/print-sftp-files.fsx:line 22
   at <StartupCode$FSI_0002>.$FSI_0002.main@() in /home/vmadmin/temp/print-sftp-files.fsx:line 30
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor)
   at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
Stopped due to error

Here's my code:

#r "nuget: SSH.NET, 2024.2.0"

open Renci.SshNet
open System
open System.IO

let getAuthMethod (user : string) : AuthenticationMethod =
    let key = Environment.GetEnvironmentVariable "SSH_KEY"
    let pwd = Environment.GetEnvironmentVariable "SSH_PWD"

    if not (String.IsNullOrEmpty key) then
        new PrivateKeyAuthenticationMethod(user, new PrivateKeyFile(new MemoryStream(Convert.FromBase64String key)))
    else if not (String.IsNullOrEmpty pwd) then
        new PasswordAuthenticationMethod(user, pwd)
    else
        failwith "Environment variable SSH_PWD or SSH_KEY must be defined"

let main host user (dir: string) =
    let auth = getAuthMethod user
    use client = new SftpClient(new ConnectionInfo(host, user, auth))

    client.Connect()

    let res = client.ListDirectory dir

    for item in res do
        printfn "%s" item.FullName

match fsi.CommandLineArgs |> List.ofArray with
| [ _; host; user; dir ] -> main host user dir
| _ -> printfn "Usage: dotnet fsi %s <host> <user> <dir>" fsi.CommandLineArgs.[0]

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions