Open
Description
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
Labels
No labels