无法通过SSH连接到PostgreSQL服务器:由于目标计算机主动拒绝它,因此无法建立连接

问题描述 投票:0回答:1

我正在尝试为使用SSH隧道从远程PostgreSQL服务器更新本地数据库的程序自动创建SSH连接。到目前为止,我一直在使用PuTTY手动打开隧道(包括使用-L命令的本地端口转发指令)。我想使用ssh.net在程序运行时自动打开端口。建立连接后,该程序将使用Entity Framework Core访问远程数据库。

当我打开与PuTTY的SSH连接时,程序运行正常。这是PuTTY命令:

//plink.exe -i "C:\Users\user.name\Desktop\host_private_key.ppk" -L 6544:111.22.33.66:6543 -N [email protected] -pw *PASSWORD*"

(删除登录详细信息以保护隐私)

这是我试图打开相同连接的ssh.net代码:

public void MakeSSHTunnel()
        {
            string password = "password";
            // path of RSA private key in openSSH format:
            string privateKeyPath = "C:/Users/user.name/.ssh/id_rsa";

            try
            {
                // creates variable to transmit RSA private key + passphrase to server via SSH.NET, openSSH compatible.
                var privateKeyFile = new PrivateKeyFile(privateKeyPath, password);
                string serverAddress = "address.io";
                string user = "user";

                // allows for the remote port forwarding options required by the server 
                using (var client = new SshClient(serverAddress, user, privateKeyFile))
                {
                    client.Connect();
                    var tunnel = new ForwardedPortLocal(6544, "111.22.33.66", 6543);
                    client.AddForwardedPort(tunnel);

                    // testing weather the connection has been successful:
                    if (client.IsConnected)
                    {
                        Console.WriteLine("OPENTUNNEL.CS: Connection to {0} successful.", serverAddress);
                        state = "Open";
                    }
                    else
                    {
                        Console.WriteLine("Connection to {0} failed.");
                        state = "Closed";
                    }

                    tunnel.Exception += delegate (object sender, ExceptionEventArgs e)
                    {
                        Console.WriteLine(e.Exception.ToString());
                    };
                    tunnel.Start();
                    Program.RunBackup();


                    // ... closes the port ... //
                    tunnel.Stop();
                    client.Disconnect();
                }
            }
            catch (UnauthorizedAccessException e)
            {
                Console.WriteLine(e);
            }
        }

我很困惑,因为在上面,if (client.IsConnected)返回true。

[当实体框架核心OnConfiguring()方法通过其optionsBuilder传递连接的详细信息时,似乎发生了错误:

optionsBuilder.UseNpgsql($"Host=127.0.0.1;Port=6544;Database=user;Username=user;Password=databasePassworh;CommandTimeout=300;Timeout=300;SSL Mode=Require;Trust Server Certificate=true;Convert Infinity DateTime=true");

出现的错误是:

NpgsqlException: Exception while connecting

和:

ExtendedSocketException: No connection could be made because the target machine actively refused it. 127.0.0.1:6544

我已经仔细检查了所有密码,并通读了所有SSH.NET文档和代码示例,并保留了之前所有有效的代码(通过PuTTY)。

[如果有人看到我在做什么错,我将不胜感激。 C#,SSH.NET和端口转发对我来说是新手,请告诉我我在哪里是白痴。

c# postgresql entity-framework-core portforwarding ssh.net
1个回答
0
投票

您可以使用它查看建立ssh连接时服务器上发生的情况:

tail  -f  /var/log/auth.log

id_rsa文件所属的密钥对可能不受服务器信任,在这种情况下,运行程序时,您会在服务器的auth.log中看到这样的一行:

"Failed publickey for user from <yourIP> port <yourPort> ssh2: RSA SHA256 

您可以从host_private_key.ppk文件中生成一个有效密钥,因为您知道所连接的服务器信任该密钥。

使用PuttyGen加载您的host_private_key.ppk文件。在转换下,您可以“导出OpenSSH”并导出私钥。 (如果其中的键用于其他用途,请不要导出和覆盖C:/Users/user.name/.ssh中的内容。)

如果您在其他路径中创建了密钥,则使程序适应新的密钥。

© www.soinside.com 2019 - 2024. All rights reserved.