使用私钥连接到服务器时出现pysftp AuthenticationException

Posted

技术标签:

【中文标题】使用私钥连接到服务器时出现pysftp AuthenticationException【英文标题】:pysftp AuthenticationException while connecting to server with private key 【发布时间】:2016-03-09 21:37:35 【问题描述】:

我正在尝试连接到 SFTP 服务器。我有一个私钥和一个密码。 我已尝试阅读有关 SO 的相关问题,但无法成功连接。

这是我尝试过的:

pysftp.Connection(host=<hostname>, username=<username>,
                  password=<password>, private_key=<path to .ppk file>)

AuthenticationException:身份验证失败

pysftp.Connection(host=<hostname>, username=<username>,
                  private_key_pass=<password>, private_key=<path to .ppk file>) 

SSHException: 不是有效的 DSA 私钥文件

但是,我可以使用相同的凭据连接 FileZilla。 FileZilla 要求输入密码并将.ppk 文件转换为不受保护的文件。

我尝试使用与 FileZilla 中相同的主机名、用户名和密钥文件,但我不断收到错误消息。 还尝试使用 Paramiko 进行连接。

【问题讨论】:

【参考方案1】:

我终于可以连接了。

使用 PuTTY 将文件转换为 .pem 文件。传递了这个.pem 文件并保持其余参数与以前相同。

pysftp.Connection(host='hostname', username='username',
                   password='password', private_key='path to .pem file')

希望这可以帮助遇到类似问题的人。

【讨论】:

所以即使您使用 PEM 密钥,您仍然必须使用密码参数吗?我目前遇到了同样的问题。 这是一个将 .ppk 转换为 .pem 以及反之亦然的指令:aws.amazon.com/premiumsupport/knowledge-center/… 正如 Martin Prikryl 指出的那样,您不能将密码与 private_key 一起使用。这可能应该是private_key_pass=&lt;password&gt;,就像在原始代码示例中一样【参考方案2】:

我通过从 pysftp0.2.9 降级到 pysftp 0.2.8 解决了这个问题

pip install pysftp==0.2.8

我在连接字符串中使用了私钥和私钥密码,如下所示:

import pysftp as sftp
import sys
srver = sftp.Connection(host='xx.xxx.xx.xx',username='xxxxx',password='xxx',port=9999,private_key='C:\\Users\xxxx\xxx\id_rsa.ppk',private_key_pass='xxxxxx')

请记住,端口实际上是一个数字而不是字符串。该解决方案适用于所有想要使用私钥和私钥密码以及主机名、用户名和用户密码进行连接的人。

【讨论】:

了解为什么需要降级以解决问题会很有帮助。 我想试试,虽然那个版本的pysftp只兼容python[version='2.7.*|3.4.*|3.5.*']【参考方案3】:

当您从 linux 控制台使用 ssh-keygen 添加密钥时,您可以直接使用选项 -m PEM 而不是使用 Putty。

ssh-keygen -t rsa -m PEM

【讨论】:

没有更多信息,这只是对@heathensoul 答案的评论,而不是独立的答案。【参考方案4】:

我能够解决同样的问题

ssh-keygen -t rsa -m PEM" command and 
pysftp.Connection(host='hostname', username='username',
                   private_key_pass='password', private_key='path to .pem file')

【讨论】:

我不明白这如何回答这个问题。您已经展示了如何生成新密钥。关于使用现有密钥的问题。 在我的情况下,问题出在我的私钥上,pysftp 不支持我生成该密钥的方式,我能够使用以这种方式生成的新密钥来解决。 但是您不能只生成一个新密钥。您必须将其公钥放在服务器上,您的答案甚至没有提及。以及为什么要这样做,如果您可以简单地将现有密钥转换为 pysftp 支持的格式。【参考方案5】:

我在 Linux 环境中遇到了同样的问题,我试图从接受的答案中遵循解决方案。我遇到的第一个问题是将.ppk 文件转换为.pem 文件。我发现在Debian环境下,我们可以使用PuTTY工具将.ppk文件转换为.pem文件

$ sudo apt-get install putty-tools
$ puttygen abc.ppk -O private-openssh -o abc.pem

我在尝试接受的答案时遇到的第二个问题是身份验证错误,我使用 private_key_pass 而不是 password 并且能够建立连接。

cnopts = pysftp.CnOpts()

cnopts = modify_cnopts_as_you_wish(cnopts)

srv = pysftp.Connection(host="hostname", username="user",
                        private_key='path_to_abc.pem',
                        private_key_pass="password", 
                        cnopts=cnopts)

【讨论】:

以上是关于使用私钥连接到服务器时出现pysftp AuthenticationException的主要内容,如果未能解决你的问题,请参考以下文章

使用 SSH 公钥/私钥连接到 sFTP 服务器。错误 Invalid private key file. 使用 SSH.NET

使用 ansible-vault 加密私钥连接到远程主机不起作用

使用私钥通过 pysftp 连接到 SFTP 服务器时“找不到主机 ***** 的主机密钥”

PySFTP失败,“在部署Django / Heroku时出现”找不到主机X的主机密钥”

Python PYSFTP - 将私钥作为字符串/文本传递,而不是传递文件路径

使用pysftp通过跳转服务器连接