【发布时间】:2019-12-14 00:59:07
【问题描述】:
我知道这个问题已经在其他帖子中提出过,但我找不到任何令人满意的答案。
我正在使用 Renci.SSH(C# 中的 SSH.NET 版本 2016.1.0)连接到 SFTP。我有一个使用 SSH 密钥和密码连接的 SFTP 服务器。
当我通过计算机上的 WinSCP 进行连接时,它运行良好。我想从我的 C# 代码中做同样的事情,但我得到:
Renci.SshNet.Common.SshAuthenticationException: '权限被拒绝(密码)。'
我的 PPP 文件是由 PuTTYgen 生成的,而且 Renci.SSH 似乎不支持 PuTTY 格式。实际上,按原样使用 ppk 文件,我得到一个:
Renci.SshNet.Common.SshException: '无效的私钥文件。'。
因此,我必须使用 PuTTY 密钥生成器将我的 .ppk 转换为 OpenSSH 格式Conversions --> Export OpenSSH Key using RSA。
下面是生成的 .ppk 文件的示例:
-----BEGIN RSA PRIVATE KEY-----
s8KrhoAE5MFNyd4P/zPmxBkOh3ZwIAXG7ns9srdNuFv0/UBu4tsRAoGBAMD0JIo1
808CfyBDkhpGXk8eQzIskFDA+HOpjDAmakHdHufCa5GEZXGnsFnKhy+2tD0HZVAW
rZFwpBiJezc4apAnh8ecgChvsZmCc9vTS2N+Da8MjptYFc0wJRExj1bUXbImIFA5
C7HtAoGBAOcNv6EJtzW80QN/0zFrBZ93vwI2BQ/G7A0tcdKRZZuOfoHs4R0vQ014
Vib+M5+D2V9qY91ZCRGrSXpHdi2CaMOqXnvnNHfNhPNAQBDkuq4qvVC+2dNS8o5+
s8KrhoAE5MFNyd4P/zPmxBkOh3ZwIAXG7ns9srdNuFv0/UBu4tsRAoGBAMD0JIo1
wFmOcvjya9upNZW28J6SCPtezddQcHUCysl0EDe8b+uA/Cn7+oFpSgUOraFJ3eAC
TIrccvWOXAjQN08SSoIpMjnIIRh00BCh6mVUJgAGpTPsveNGNwBqwgfHRuU/9gvH
b7XIKYXLV27a7vz+kXGeHmicXmKUuAf0e9FW5EEPtCkxWXOAeFyVjvGiIPaKXHF7
808CfyBDkhpGXk8eQzIskFDA+HOpjDAmakHdHufCa5GEZXGnsFnKhy+2tD0HZVAW
rZFwpBiJezc4apAnh8ecgChvsZmCc9vTS2N+Da8MjptYFc0wJRExj1bUXbImIFA5
C7HtAoGBAOcNv6EJtzW80QN/0zFrBZ93vwI2BQ/G7A0tcdKRZZuOfoHs4R0vQ014
Vib+M5+D2V9qY91ZCRGrSXpHdi2CaMOqXnvnNHfNhPNAQBDkuq4qvVC+2dNS8o5+
808CfyBDkhpGXk8eQzIskFDA+HOpjDAmakHdHufCa5GEZXGnsFnKhy+2tD0HZVAW
rZFwpBiJezc4apAnh8ecgChvsZmCc9vTS2N+Da8MjptYFc0wJRExj1bUXbImIFA5
C7HtAoGBAOcNv6EJtzW80QN/0zFrBZ93vwI2BQ/G7A0tcdKRZZuOfoHs4R0vQ014
Vib+M5+D2V9qY91ZCRGrSXpHdi2CaMOqXnvnNHfNhPNAQBDkuq4qvVC+2dNS8o5+
s8KrhoAE5MFNyd4P/zPmxBkOh3ZwIAXG7ns9srdNuFv0/UBu4tsRAoGBAMD0JIo1
wFmOcvjya9upNZW28J6SCPtezddQcHUCysl0EDe8b+uA/Cn7+oFpSgUOraFJ3eAC
TIrccvWOXAjQN08SSoIpMjnIIRh00BCh6mVUJgAGpTPsveNGNwBqwgfHRuU/9gvH
p6VRzmTNYJUaU/C/zJqdd2YFp18kcUzqdfptlIv20qoFmFKI4Z/Fiexep7pW8RZL
b7XIKYXLV27a7vz+kXGeHmicXmKUuAf0e9FW5EEPtCkxWXOAeFyVjvGiIPaKXHF7
808CfyBDkhpGXk8eQzIskFDA+HOpjDAmakHdHufCa5GEZXGnsFnKhy+2tD0HZVAW
rZFwpBiJezc4apAnh8ecgChvsZmCc9vTS2N+Da8MjptYFc0wJRExj1bUXbImIFA5
a6872Eh69Z3WkD8NGJZ1t/gApUxzdgGAckoRoS2Gz71gUuU=
-----END RSA PRIVATE KEY-----
然后我连接到 SFTP 服务器如下:
private static void CreateSftpSession(FtpConnectionSettings settings, Action<IFtpSession> onSessionOpen)
{
var methods = new List<AuthenticationMethod>();
methods.Add(new PasswordAuthenticationMethod(settings.UserName, settings.UserPassword));
if (!string.IsNullOrEmpty(settings.PrivateKeyPath))
{
var keyFiles = new[] { new PrivateKeyFile(settings.PrivateKeyPath) };
methods.Add(new PrivateKeyAuthenticationMethod(settings.UserName, keyFiles));
}
var connectionInfo = new ConnectionInfo(settings.Host, settings.Port, settings.UserName, methods.ToArray());
using (SftpClient sftpClient = new SftpClient(connectionInfo))
{
SftpSession sftpSession = new SftpSession(sftpClient);
sftpClient.Connect();
onSessionOpen(sftpSession);
sftpClient.Disconnect();
}
}
在调用sftpClient.Connect()时,抛出异常。
你觉得我做的有什么不对吗?
非常感谢您的帮助
这里是按要求成功连接 WinSCP 的日志:
。 2019-12-10 14:54:45.922 -------------------------------------------------- ---------------------- 。 2019-12-10 14:54:45.922 WinSCP 版本 5.15.9(内部版本 10071)(操作系统 10.0.17763 - Windows 10 企业版)。 2019-12-10 14:54:45.922 配置:HKCU\Software\Martin Prikryl\WinSCP 2\。 2019-12-10 14:54:45.922 日志级别:正常。 2019-12-10 14:54:45.922 本地 帐号:XXXX\xxx 。 2019-12-10 14:54:45.922 工作目录: C:\Program Files (x86)\WinSCP 。 2019-12-10 14:54:45.922 进程 ID: 20716 . 2019-12-10 14:54:45.923 命令行:“C:\Program Files (x86)\WinSCP\WinSCP.exe" . 2019-12-10 14:54:45.923 时区: 当前:GMT+1,标准:GMT+1(西欧标准时间),DST:GMT+2 (西欧夏令时间),夏令时开始:2019 年 3 月 31 日,夏令时结束:2019 年 10 月 27 日。 2019-12-10 14:54:45.923 登录时间:2019年12月10日星期二2:54:45 下午。 2019-12-10 14:54:45.923 -------------------------------------------------- ---------------------- 。 2019-12-10 14:54:45.923 会话名称:my_ftp_user@my_ftp_host.com (地点) 。 2019-12-10 14:54:45.923 主机名:my_ftp_host.com(端口: 6671)。 2019-12-10 14:54:45.924 用户名:my_ftp_user(密码:是, 密钥文件:是,密码:否)。 2019-12-10 14:54:45.924 隧道:没有。 2019-12-10 14:54:45.924 传输协议:SFTP (SCP)。 2019-12-10 14:54:45.924 Ping 类型:关闭,Ping 间隔:30 秒;超时:15 秒。 2019-12-10 14:54:45.924 禁用 Nagle:否。 2019-12-10 14:54:45.924 代理:无。 2019-12-10 14:54:45.924 发送缓冲区:262144。 2019-12-10 14:54:45.924 SSH 协议版本:2;压缩:没有。 2019-12-10 14:54:45.924 绕过身份验证:否。 2019-12-10 14:54:45.924 试试 代理:是的;代理转发:无; TIS/加密卡:否;基:是的; GSSAPI: 是的 。 2019-12-10 14:54:45.924 GSSAPI:转发:否;库: gssapi32,sspi,自定义;风俗: 。 2019-12-10 14:54:45.924 密码: aes,chacha20,blowfish,3des,WARN,arcfour,des; SSH2DES:没有。 2019-12-10 14:54:45.924 凯克斯: ecdh,dh-gex-sha1,dh-group14-sha1,rsa,WARN,dh-group1-sha1。 2019-12-10 14:54:45.924 SSH 错误: 自动,自动,自动,自动,自动,自动,自动,自动,自动,自动,自动,自动,自动。 2019-12-10 14:54:45.924 简单频道:是的。 2019-12-10 14:54:45.924 返回代码变量:自动检测;查找用户组: Auto 。 2019-12-10 14:54:45.924 外壳:默认。 2019-12-10 14:54:45.924 停产: LF,UTF:自动。 2019-12-10 14:54:45.924 清除别名:是,未设置 nat.vars:是的,解决符号链接:是的;按照目录符号链接:否。 2019-12-10 14:54:45.924 LS:ls -la,Ign LS 警告:是,Scp1 比较:否; 退出代码 1 是错误:否。 2019-12-10 14:54:45.924 SFTP 错误: 自动,自动。 2019-12-10 14:54:45.924 SFTP 服务器:默认。 2019-12-10 14:54:45.924 本地目录:\xxxx.xxx\xxx\RFs\xxx\Documents,远程 目录:/log,更新:是,缓存:是。 2019-12-10 14:54:45.924 缓存目录更改:是,永久:是。 2019-12-10 14:54:45.924 回收站:删除到:否,覆盖到:否,Bin 路径:。 2019-12-10 14:54:45.924 DST 模式:Unix 。 2019-12-10 14:54:45.924 -------------------------------------------------- ---------------------- 。 2019-12-10 14:54:45.965 为 SSH 查找主机“my_ftp_host.com” 联系 。 2019-12-10 14:54:45.999 连接到 64.209.89.13 端口 6671。 2019-12-10 14:54:46.103 我们声明版本: SSH-2.0-WinSCP_release_5.15.9 。 2019-12-10 14:54:46.206 服务器 版本: SSH-2.0-SSHD 。 2019-12-10 14:54:46.206 使用 SSH 协议 第 2 版。 2019-12-10 14:54:46.206 有一个已知的 rsa2 类型的主机密钥 . 2019-12-10 14:54:46.206 做 Diffie-Hellman 小组交流。 2019-12-10 14:54:46.701 使用哈希进行 Diffie-Hellman 密钥交换 SHA-256 。 2019-12-10 14:54:47.496 主机密钥指纹是:. 2019-12-10 14:54:47.496 SSH-RSA 2048 bc:37:d9:2a:15:93:3c:a6:a0:e9:88:5e:86:81:8d:43 mxhRidA9vIdsw+hmLZfFnLI/0BujM3kjJPrH5no9wGI=。 2019-12-10 14:54:47.503 主机键匹配缓存键。 2019-12-10 14:54:47.503 初始化 AES-256 SDCTR 客户端->服务器加密。 2019-12-10 14:54:47.503 初始化 HMAC-SHA1 客户端->服务器 MAC 算法。 2019-12-10 14:54:47.503 初始化 AES-256 SDCTR 服务器->客户端加密。 2019-12-10 14:54:47.503 初始化 HMAC-SHA1 服务器->客户端 MAC 算法 。 2019-12-10 14:54:47.707 读取密钥文件 “C:\Temp\AttribByStrategy\My_PrivateKey_wopp.ppk”。 2019-12-10 14:54:47.708 选美正在运行。请求密钥。 . 2019-12-10 14:54:47.708 选美有 0 个 SSH-2 密钥。 2019-12-10 14:54:47.708 配置的密钥文件不在选美中! 2019-12-10 14:54:47.708 使用 用户名“my_ftp_user”。 . 2019-12-10 14:54:58.649 服务器提供了这些 身份验证方法:密码、公钥、键盘交互。 2019-12-10 14:54:58.649 提供公钥。 2019-12-10 14:54:58.758 接受提供公钥! 2019-12-10 14:54:58.758 认证 使用公钥“rsa-key-20140520”。 2019-12-10 14:54:58.878 已发送 公钥签名! 2019-12-10 14:54:58.981 进一步认证 必需的 。 2019-12-10 14:54:59.007 需要进一步验证。 2019-12-10 14:54:59.007 服务器提供了以下身份验证方法: 密码,键盘交互Àí½œt»Yªâ…©xоñs€ç'ð¾€Ó。 2019-12-10 14:54:59.007 尝试键盘交互式身份验证 . 2019-12-10 14:54:59.110 提示(键盘交互,“SSH服务器: 密码验证”、“使用键盘交互 身份验证。”,“密码:”)。 2019-12-10 14:54:59.110 使用存储 密码。 . 2019-12-10 14:54:59.295 已授予访问权限。 2019-12-10 14:54:59.295 开场为主频道。 2019-12-10 14:54:59.397 开通了主渠道。 2019-12-10 14:54:59.641 启动了一个 shell/命令 . 2019-12-10 14:54:59.668 -------------------------------------------------- ---------------------- 。 2019-12-10 14:54:59.668 使用 SFTP 协议。 . 2019-12-10 14:54:59.668 与主持人进行启动对话。
2019-12-10 14:54:59.684 类型:SSH_FXP_INIT,大小:5,数量:-1
【问题讨论】:
-
是的,但实际上密码在那里并且正确定义。我手动连接的时候用过
-
所以你真的是说你使用多重身份验证(password 和 private 密钥)?您不会将帐户密码与私钥密码搞错吗?
-
是的,我调试了代码看看变量是否定义正确。该文件存在,因为它与我使用来自同一机器和用户的 WinSCP 形式相同。如果文件丢失,我会有一个文件未找到异常。并且密码是帐户密码,而不是用于生成密钥的密码。我也试过了
-
您是否尝试将身份验证方法按 WinSCP 使用它们的顺序排列? - 密钥后的密码
-
您好,马丁,这正是问题所在。方法列表中身份验证方法的顺序很重要。我刚刚在 PasswordAuthenticationMethod 之前添加了 PrivateKeyAuthenticationMethod,它工作正常。非常感谢,做得好!