如何使用 ppk 公钥通过 python Paramiko 进行 ssh 连接

Posted

技术标签:

【中文标题】如何使用 ppk 公钥通过 python Paramiko 进行 ssh 连接【英文标题】:How to ssh connect through python Paramiko with ppk public key 【发布时间】:2012-01-13 01:08:48 【问题描述】:

我正在使用Paramiko 通过 ssh 连接到服务器。

基本身份验证运行良好,但我不明白如何使用公钥连接。

当我连接 putty 时,服务器会告诉我:

Using username "root".
Authenticating with public key "rsa-key@ddddd.com"
Passphrase for key "rsa-key@ddddd.com": [i've inserted the passphrase here]
Last login: Mon Dec  5 09:25:18 2011 from ...

我用这个 ppk 文件连接到它:

PuTTY-User-Key-File-2: ssh-rsa
Encryption: aes256-cbc
Comment: rsa-key@dddd.com
Public-Lines: 4
[4 lines key]
Private-Lines: 8
[8 lines key]
Private-MAC: [hash]

使用基本身份验证,我得到的错误(来自日志)是:

DEB [20111205-09:48:44.328] thr=1   paramiko.transport: userauth is OK
DEB [20111205-09:48:44.927] thr=1   paramiko.transport: Authentication type (password) not permitted.
DEB [20111205-09:48:44.927] thr=1   paramiko.transport: Allowed methods: ['publickey', 'gssapi-with-mic']

我尝试包含该 ppk 文件并设置为 auth_public_key,但没有成功。

你能帮帮我吗?

【问题讨论】:

paramiko 使用 openssh 格式的密钥。由于密钥是加密的,因此您还需要先解密密钥。使用 ssh-agent 会让事情变得更容易,paramiko 可以自动检查代理密钥。 【参考方案1】:

好的,@Adam 和@Kimvais 是对的,Paramiko 无法解析 .ppk 文件。

所以要走的路(也感谢@JimB)是将 .ppk 文件转换为 OpenSSH 私钥格式;这可以使用PuTTYgen 来实现,如here 所述。

那么连接起来就很简单了:

import paramiko
ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect('<hostname>', username='<username>', password='<password>', key_filename='<path/to/openssh-private-key-file>')

stdin, stdout, stderr = ssh.exec_command('ls')
print stdout.readlines()
ssh.close()

【讨论】:

强制警告:不要使用AutoAddPolicy,除非您不关心安全性。这样你就失去了对 MITM 攻击的保护。有关正确的解决方案,请参阅***.com/q/10670217/850848#43093883。【参考方案2】:

对我来说,我这样做:

import paramiko
hostname = 'my hostname or IP' 
myuser   = 'the user to ssh connect'
mySSHK   = '/path/to/sshkey.pub'
sshcon   = paramiko.SSHClient()  # will create the object
sshcon.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # no known_hosts error
sshcon.connect(hostname, username=myuser, key_filename=mySSHK) # no passwd needed

很适合我

【讨论】:

这不是公钥,是私钥。 确实,“key_filename”字段需要私钥。使用 OpenSSH 公钥,程序会发出此异常:paramiko.ssh_exception.SSHException: not a valid OPENSSH private key file 如果您有 RSA 密钥对的密码,则像这样连接 ssh.connect('', port=22, username='',password='', key_filename='') 我的关键是文件扩展名是 ppk。我需要改变这个吗? ppk 到 pub ?【参考方案3】:

在 Puttygen 中创建 Paramiko 支持的有效 DSA 格式私钥。

点击转换然后导出 OpenSSH 密钥

【讨论】:

【参考方案4】:

@VonC 对(已删除)重复问题的回答:

如果如评论所述,Paraminko 不支持 PPK 密钥,则官方解决方案(如此处所示)将使用 PuTTYgen。

但您也可以使用Python library CkSshKey 直接在您的程序中进行相同的转换。

见“Convert PuTTY Private Key (ppk) to OpenSSH (pem)”

import sys
import chilkat

key = chilkat.CkSshKey()

#  Load an unencrypted or encrypted PuTTY private key.

#  If  your PuTTY private key is encrypted, set the Password
#  property before calling FromPuttyPrivateKey.
#  If your PuTTY private key is not encrypted, it makes no diffference
#  if Password is set or not set.
key.put_Password("secret")

#  First load the .ppk file into a string:

keyStr = key.loadText("putty_private_key.ppk")

#  Import into the SSH key object:
success = key.FromPuttyPrivateKey(keyStr)
if (success != True):
    print(key.lastErrorText())
    sys.exit()

#  Convert to an encrypted or unencrypted OpenSSH key.

#  First demonstrate converting to an unencrypted OpenSSH key

bEncrypt = False
unencryptedKeyStr = key.toOpenSshPrivateKey(bEncrypt)
success = key.SaveText(unencryptedKeyStr,"unencrypted_openssh.pem")
if (success != True):
    print(key.lastErrorText())
    sys.exit()

【讨论】:

以上是关于如何使用 ppk 公钥通过 python Paramiko 进行 ssh 连接的主要内容,如果未能解决你的问题,请参考以下文章

gitlab 配置

各种格式SSH 公钥和私钥之间的转换

在 Mac 终端中使用 PPK 文件通过 SSH 连接到远程连接 [关闭]

ppk文件用啥工具打开,在哪能下到?

如何在 Ubuntu 中使用 PuTTYgen 将 PEM 文件转换为 PPK?

TortoiseGit与Git生成ssh秘钥添加到代码托管平台